ronin-web 1.0.0.beta2 → 1.0.0.beta4
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 +4 -4
- data/.github/workflows/ruby.yml +1 -4
- data/README.md +1 -4
- data/gemspec.yml +1 -1
- data/lib/ronin/web/cli/commands/reverse_proxy.rb +9 -2
- data/lib/ronin/web/cli/commands/server.rb +7 -1
- data/lib/ronin/web/cli/commands/spider.rb +73 -37
- data/lib/ronin/web/version.rb +1 -1
- data/lib/ronin/web.rb +2 -2
- data/man/ronin-web-new-webapp.1 +1 -1
- data/man/ronin-web-new-webapp.1.md +1 -1
- data/man/ronin-web-spider.1 +5 -1
- data/man/ronin-web-spider.1.md +4 -1
- data/ronin-web.gemspec +2 -1
- metadata +5 -16
- data/spec/cli/ruby_shell_spec.rb +0 -14
- data/spec/html_spec.rb +0 -43
- data/spec/mechanize_spec.rb +0 -72
- data/spec/spec_helper.rb +0 -8
- data/spec/web_spec.rb +0 -97
- data/spec/xml_spec.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37043413378124ed9793dc5393fe121be29e770f55e0cf93db3bbf91b59927d0
|
4
|
+
data.tar.gz: 5a77f64778e370b2d8f8c0f2df6838aa62719551a2021c6a0bbd5a9a4ba15ef1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b03fec155874e2c399db5991d03089a15c1c2193c3af3ba7c501c1c26ccd48c8fc6baaa650cda1c53508e43c5bbaed757cc7223279d494e635553f369202777e
|
7
|
+
data.tar.gz: 1a163daa3263ef36c36baa1d867a7add8678742743fb5a830ba10cbfbfcb05bd9c18b97d186538220f599298bc81c3a0b7861dabb4f9a69c1813ca34b0701936
|
data/.github/workflows/ruby.yml
CHANGED
@@ -21,10 +21,7 @@ jobs:
|
|
21
21
|
uses: ruby/setup-ruby@v1
|
22
22
|
with:
|
23
23
|
ruby-version: ${{ matrix.ruby }}
|
24
|
-
|
25
|
-
run: |
|
26
|
-
sudo apt update -y && \
|
27
|
-
sudo apt install -y --no-install-recommends --no-install-suggests libsqlite3-dev libxml2-dev libxslt1-dev
|
24
|
+
bundler-cache: true
|
28
25
|
- name: Install dependencies
|
29
26
|
run: bundle install --jobs 4 --retry 3
|
30
27
|
- name: Run tests
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://github.com/ronin-rb/ronin-web/actions/workflows/ruby.yml)
|
4
4
|
[](https://codeclimate.com/github/ronin-rb/ronin-web)
|
5
|
+
[](https://badge.fury.io/rb/ronin-web)
|
5
6
|
|
6
7
|
* [Source](https://github.com/ronin-rb/ronin-web)
|
7
8
|
* [Issues](https://github.com/ronin-rb/ronin-web/issues)
|
@@ -147,8 +148,6 @@ puts doc.to_xml
|
|
147
148
|
|
148
149
|
* [Ruby] >= 3.0.0
|
149
150
|
* [nokogiri] ~> 1.4
|
150
|
-
* [libxml2]
|
151
|
-
* [libxslt1]
|
152
151
|
* [nokogiri-ext] ~> 0.1
|
153
152
|
* [nokogiri-diff] ~> 0.2
|
154
153
|
* [mechanize] ~> 2.0
|
@@ -201,8 +200,6 @@ along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
|
|
201
200
|
[nokogiri]: https://nokogiri.org/
|
202
201
|
[nokogiri-ext]: https://github.com/postmodern/nokogiri-ext#readme
|
203
202
|
[nokogiri-diff]: https://github.com/postmodern/nokogiri-diff#readme
|
204
|
-
[libxml2]: http://xmlsoft.org/
|
205
|
-
[libxslt1]: http://xmlsoft.org/XSLT/
|
206
203
|
[mechanize]: https://github.com/sparklemotion/mechanize#readme
|
207
204
|
[open_namespace]: https://github.com/postmodern/open_namespace#readme
|
208
205
|
[ronin-support]: https://github.com/ronin-rb/ronin-support#readme
|
data/gemspec.yml
CHANGED
@@ -41,7 +41,7 @@ dependencies:
|
|
41
41
|
open_namespace: ~> 0.4
|
42
42
|
# Ronin dependencies:
|
43
43
|
ronin-support: ~> 1.0.0.beta2
|
44
|
-
ronin-web-server: ~> 0.1.0.
|
44
|
+
ronin-web-server: ~> 0.1.0.beta3
|
45
45
|
ronin-web-spider: ~> 0.1.0.beta2
|
46
46
|
ronin-web-user_agents: ~> 0.1.0.beta1
|
47
47
|
ronin-core: ~> 0.1.0.beta1
|
@@ -45,7 +45,7 @@ module Ronin
|
|
45
45
|
#
|
46
46
|
# @api private
|
47
47
|
#
|
48
|
-
class
|
48
|
+
class ReverseProxy < Command
|
49
49
|
|
50
50
|
include Core::CLI::Logging
|
51
51
|
|
@@ -142,7 +142,14 @@ module Ronin
|
|
142
142
|
end
|
143
143
|
|
144
144
|
log_info "Starting proxy server on #{options[:host]}:#{options[:port]} ..."
|
145
|
-
|
145
|
+
|
146
|
+
begin
|
147
|
+
proxy.run!(host: options[:host], port: options[:port])
|
148
|
+
rescue Errno::EADDRINUSE => error
|
149
|
+
log_error(error.message)
|
150
|
+
exit(1)
|
151
|
+
end
|
152
|
+
|
146
153
|
log_info "shutting down ..."
|
147
154
|
end
|
148
155
|
|
@@ -144,7 +144,13 @@ module Ronin
|
|
144
144
|
end
|
145
145
|
|
146
146
|
log_info "Starting web server listening on #{App.host}:#{App.port} ..."
|
147
|
-
|
147
|
+
begin
|
148
|
+
App.run!
|
149
|
+
rescue Errno::EADDRINUSE => error
|
150
|
+
log_error(error.message)
|
151
|
+
exit(1)
|
152
|
+
end
|
153
|
+
|
148
154
|
log_info "Shutting down ..."
|
149
155
|
end
|
150
156
|
|
@@ -49,7 +49,7 @@ module Ronin
|
|
49
49
|
# -P, --proxy PROXY Sets the proxy to use.
|
50
50
|
# -H, --header NAME: VALUE Sets a default header
|
51
51
|
# --host-header NAME=VALUE Sets a default header
|
52
|
-
# -u
|
52
|
+
# -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,
|
53
53
|
# --user-agent The User-Agent to use
|
54
54
|
# -U, --user-agent-string STRING The User-Agent string to use
|
55
55
|
# -R, --referer URL Sets the Referer URL
|
@@ -83,6 +83,7 @@ module Ronin
|
|
83
83
|
# --print-status Print the status codes for each URL
|
84
84
|
# --print-headers Print response headers for each URL
|
85
85
|
# --print-header NAME Prints a specific header
|
86
|
+
# --history FILE The history file
|
86
87
|
# --archive DIR Archive every visited page to the DIR
|
87
88
|
# --git-archive DIR Archive every visited page to the git repository
|
88
89
|
# -X, --xpath XPATH Evaluates the XPath on each HTML page
|
@@ -183,7 +184,11 @@ module Ronin
|
|
183
184
|
|
184
185
|
option :user_agent, short: '-u',
|
185
186
|
value: {
|
186
|
-
type:
|
187
|
+
type: Hash[
|
188
|
+
Support::Network::HTTP::UserAgents::ALIASES.keys.map { |key|
|
189
|
+
[key.to_s.tr('_','-'), key]
|
190
|
+
}
|
191
|
+
]
|
187
192
|
},
|
188
193
|
desc: 'The User-Agent to use' do |name|
|
189
194
|
@user_agent = name
|
@@ -386,7 +391,7 @@ module Ronin
|
|
386
391
|
},
|
387
392
|
desc: 'Spiders the website, starting at the URL'
|
388
393
|
|
389
|
-
option :
|
394
|
+
option :print_stauts, desc: 'Print the status codes for each URL'
|
390
395
|
|
391
396
|
option :print_headers, desc: 'Print response headers for each URL'
|
392
397
|
|
@@ -396,6 +401,12 @@ module Ronin
|
|
396
401
|
},
|
397
402
|
desc: 'Prints a specific header'
|
398
403
|
|
404
|
+
option :history, value: {
|
405
|
+
type: String,
|
406
|
+
usage: 'FILE'
|
407
|
+
},
|
408
|
+
desc: 'The history file'
|
409
|
+
|
399
410
|
option :archive, value: {
|
400
411
|
type: String,
|
401
412
|
usage: 'DIR'
|
@@ -548,6 +559,10 @@ module Ronin
|
|
548
559
|
Web::Spider::GitArchive.open(options[:git_archive])
|
549
560
|
end
|
550
561
|
|
562
|
+
history_file = if options[:history]
|
563
|
+
File.open(options[:history],'w')
|
564
|
+
end
|
565
|
+
|
551
566
|
agent = new_agent do |agent|
|
552
567
|
agent.every_page do |page|
|
553
568
|
print_page(page)
|
@@ -557,39 +572,12 @@ module Ronin
|
|
557
572
|
print_verbose "failed to request #{url}"
|
558
573
|
end
|
559
574
|
|
560
|
-
|
561
|
-
agent.every_host do |host|
|
562
|
-
print_verbose "spidering new host #{host}"
|
563
|
-
end
|
564
|
-
end
|
565
|
-
|
566
|
-
if options[:print_certs]
|
567
|
-
agent.every_cert do |cert|
|
568
|
-
print_verbose "encountered new certificate for #{cert.subject.common_name}"
|
569
|
-
end
|
570
|
-
end
|
571
|
-
|
572
|
-
if options[:print_js_strings]
|
573
|
-
agent.every_js_string do |string|
|
574
|
-
print_content string
|
575
|
-
end
|
576
|
-
end
|
577
|
-
|
578
|
-
if options[:print_html_comments]
|
579
|
-
agent.every_html_comment do |comment|
|
580
|
-
print_content comment
|
581
|
-
end
|
582
|
-
end
|
575
|
+
define_printing_callbacks(agent)
|
583
576
|
|
584
|
-
if
|
585
|
-
agent.
|
586
|
-
|
587
|
-
|
588
|
-
end
|
589
|
-
|
590
|
-
if options[:print_comments]
|
591
|
-
agent.every_comment do |comment|
|
592
|
-
print_content comment
|
577
|
+
if history_file
|
578
|
+
agent.every_page do |page|
|
579
|
+
history_file.puts(page.url)
|
580
|
+
history_file.flush
|
593
581
|
end
|
594
582
|
end
|
595
583
|
|
@@ -626,6 +614,54 @@ module Ronin
|
|
626
614
|
puts
|
627
615
|
end
|
628
616
|
end
|
617
|
+
ensure
|
618
|
+
if options[:history]
|
619
|
+
history_file.close
|
620
|
+
end
|
621
|
+
end
|
622
|
+
|
623
|
+
#
|
624
|
+
# Defines callbacks that print information.
|
625
|
+
#
|
626
|
+
# @param [Ronin::Web::Spider::Agent] agent
|
627
|
+
# The newly created agent.
|
628
|
+
#
|
629
|
+
def define_printing_callbacks(agent)
|
630
|
+
if options[:print_hosts]
|
631
|
+
agent.every_host do |host|
|
632
|
+
print_verbose "spidering new host #{host}"
|
633
|
+
end
|
634
|
+
end
|
635
|
+
|
636
|
+
if options[:print_certs]
|
637
|
+
agent.every_cert do |cert|
|
638
|
+
print_verbose "encountered new certificate for #{cert.subject.common_name}"
|
639
|
+
end
|
640
|
+
end
|
641
|
+
|
642
|
+
if options[:print_js_strings]
|
643
|
+
agent.every_js_string do |string|
|
644
|
+
print_content string
|
645
|
+
end
|
646
|
+
end
|
647
|
+
|
648
|
+
if options[:print_html_comments]
|
649
|
+
agent.every_html_comment do |comment|
|
650
|
+
print_content comment
|
651
|
+
end
|
652
|
+
end
|
653
|
+
|
654
|
+
if options[:print_js_comments]
|
655
|
+
agent.every_js_comment do |comment|
|
656
|
+
print_content comment
|
657
|
+
end
|
658
|
+
end
|
659
|
+
|
660
|
+
if options[:print_comments]
|
661
|
+
agent.every_comment do |comment|
|
662
|
+
print_content comment
|
663
|
+
end
|
664
|
+
end
|
629
665
|
end
|
630
666
|
|
631
667
|
#
|
@@ -713,7 +749,7 @@ module Ronin
|
|
713
749
|
# @param [Spidr::Page] page
|
714
750
|
# A spidered page.
|
715
751
|
#
|
716
|
-
def
|
752
|
+
def print_status(page)
|
717
753
|
if page.code < 300
|
718
754
|
print "#{colors.bright_green(page.code)} "
|
719
755
|
elsif page.code < 400
|
@@ -750,7 +786,7 @@ module Ronin
|
|
750
786
|
# A spidered page.
|
751
787
|
#
|
752
788
|
def print_page(page)
|
753
|
-
|
789
|
+
print_status(page) if options[:print_status]
|
754
790
|
print_url(page)
|
755
791
|
|
756
792
|
if options[:print_headers]
|
data/lib/ronin/web/version.rb
CHANGED
data/lib/ronin/web.rb
CHANGED
@@ -240,7 +240,7 @@ module Ronin
|
|
240
240
|
# @param [Array, Hash] parameters
|
241
241
|
# Additional parameters for the GET request.
|
242
242
|
#
|
243
|
-
# param [Hash] headers
|
243
|
+
# @param [Hash] headers
|
244
244
|
# Additional headers for the GET request.
|
245
245
|
#
|
246
246
|
# @yield [page]
|
@@ -282,7 +282,7 @@ module Ronin
|
|
282
282
|
# @param [Array, Hash] parameters
|
283
283
|
# Additional parameters for the GET request.
|
284
284
|
#
|
285
|
-
# param [Hash] headers
|
285
|
+
# @param [Hash] headers
|
286
286
|
# Additional headers for the GET request.
|
287
287
|
#
|
288
288
|
# @yield [body]
|
data/man/ronin-web-new-webapp.1
CHANGED
@@ -22,7 +22,7 @@ The project directory to create\.
|
|
22
22
|
.LP
|
23
23
|
.TP
|
24
24
|
\fB--port\fR \fIPORT\fP
|
25
|
-
The port the
|
25
|
+
The port the webapp will listen on by default\. Defaults to \fB3000\fR\.
|
26
26
|
.LP
|
27
27
|
.TP
|
28
28
|
\fB--ruby-version\fR \fIVERSION\fP
|
@@ -16,7 +16,7 @@ Generates a new `ronin-web-server` based webapp.
|
|
16
16
|
## OPTIONS
|
17
17
|
|
18
18
|
`--port` *PORT*
|
19
|
-
The port the
|
19
|
+
The port the webapp will listen on by default. Defaults to `3000`.
|
20
20
|
|
21
21
|
`--ruby-version` *VERSION*
|
22
22
|
The desired ruby version for the project Defaults to the current ruby version.
|
data/man/ronin-web-spider.1
CHANGED
@@ -47,7 +47,7 @@ Sets a default header\.
|
|
47
47
|
Sets a default header\.
|
48
48
|
.LP
|
49
49
|
.HP
|
50
|
-
\fB-u\fR, \fB--user-agent\fR chrome
|
50
|
+
\fB-u\fR, \fB--user-agent\fR chrome\-linux\[or]chrome\-macos\[or]chrome\-windows\[or]chrome\-iphone\[or]chrome\-ipad\[or]chrome\-android\[or]firefox\-linux\[or]firefox\-macos\[or]firefox\-windows\[or]firefox\-iphone\[or]firefox\-ipad\[or]firefox\-android\[or]safari\-macos\[or]safari\-iphone\[or]safari\-ipad\[or]edge
|
51
51
|
The \fBUser-Agent\fR to use\.
|
52
52
|
.LP
|
53
53
|
.TP
|
@@ -179,6 +179,10 @@ Print response headers for each URL\.
|
|
179
179
|
Prints a specific header\.
|
180
180
|
.LP
|
181
181
|
.TP
|
182
|
+
\fB--history\fR \fIFILE\fP
|
183
|
+
Sets the history file to write every visited URL to\.
|
184
|
+
.LP
|
185
|
+
.TP
|
182
186
|
\fB--archive\fR \fIDIR\fP
|
183
187
|
Archive every visited page to the \fIDIR\fP\.
|
184
188
|
.LP
|
data/man/ronin-web-spider.1.md
CHANGED
@@ -34,7 +34,7 @@ Spiders a website.
|
|
34
34
|
`--host-header` *NAME*=*VALUE*
|
35
35
|
Sets a default header.
|
36
36
|
|
37
|
-
`-u`, `--user-agent`
|
37
|
+
`-u`, `--user-agent` 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
|
38
38
|
The `User-Agent` to use.
|
39
39
|
|
40
40
|
`-U`, `--user-agent-string` *STRING*
|
@@ -133,6 +133,9 @@ Spiders a website.
|
|
133
133
|
`--print-header` *NAME*
|
134
134
|
Prints a specific header.
|
135
135
|
|
136
|
+
`--history` *FILE*
|
137
|
+
Sets the history file to write every visited URL to.
|
138
|
+
|
136
139
|
`--archive` *DIR*
|
137
140
|
Archive every visited page to the *DIR*.
|
138
141
|
|
data/ronin-web.gemspec
CHANGED
@@ -26,6 +26,8 @@ Gem::Specification.new do |gem|
|
|
26
26
|
gem.files = `git ls-files`.split($/)
|
27
27
|
gem.files = glob[gemspec['files']] if gemspec['files']
|
28
28
|
gem.files += Array(gemspec['generated_files'])
|
29
|
+
# exclude test files from the packages gem
|
30
|
+
gem.files -= glob[gemspec['test_files'] || 'spec/{**/}*']
|
29
31
|
|
30
32
|
gem.executables = gemspec.fetch('executables') do
|
31
33
|
glob['bin/*'].map { |path| File.basename(path) }
|
@@ -33,7 +35,6 @@ Gem::Specification.new do |gem|
|
|
33
35
|
gem.default_executable = gem.executables.first if Gem::VERSION < '1.7.'
|
34
36
|
|
35
37
|
gem.extensions = glob[gemspec['extensions'] || 'ext/**/extconf.rb']
|
36
|
-
gem.test_files = glob[gemspec['test_files'] || 'spec/{**/}*_spec.rb']
|
37
38
|
gem.extra_rdoc_files = glob[gemspec['extra_doc_files'] || '*.{txt,md}']
|
38
39
|
|
39
40
|
gem.require_paths = Array(gemspec.fetch('require_paths') {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ronin-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Postmodern
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-01-
|
11
|
+
date: 2023-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.1.0.
|
103
|
+
version: 0.1.0.beta3
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.1.0.
|
110
|
+
version: 0.1.0.beta3
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: ronin-web-spider
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -245,12 +245,6 @@ files:
|
|
245
245
|
- man/ronin-web.1
|
246
246
|
- man/ronin-web.1.md
|
247
247
|
- ronin-web.gemspec
|
248
|
-
- spec/cli/ruby_shell_spec.rb
|
249
|
-
- spec/html_spec.rb
|
250
|
-
- spec/mechanize_spec.rb
|
251
|
-
- spec/spec_helper.rb
|
252
|
-
- spec/web_spec.rb
|
253
|
-
- spec/xml_spec.rb
|
254
248
|
homepage: https://github.com/ronin-rb/ronin-web#readme
|
255
249
|
licenses:
|
256
250
|
- GPL-3.0
|
@@ -274,9 +268,4 @@ rubygems_version: 3.3.26
|
|
274
268
|
signing_key:
|
275
269
|
specification_version: 4
|
276
270
|
summary: A collection of common web security commands and libraries.
|
277
|
-
test_files:
|
278
|
-
- spec/cli/ruby_shell_spec.rb
|
279
|
-
- spec/html_spec.rb
|
280
|
-
- spec/mechanize_spec.rb
|
281
|
-
- spec/web_spec.rb
|
282
|
-
- spec/xml_spec.rb
|
271
|
+
test_files: []
|
data/spec/cli/ruby_shell_spec.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web/cli/ruby_shell'
|
3
|
-
|
4
|
-
describe Ronin::Web::CLI::RubyShell do
|
5
|
-
describe "#initialize" do
|
6
|
-
it "must default #name to 'ronin-web'" do
|
7
|
-
expect(subject.name).to eq('ronin-web')
|
8
|
-
end
|
9
|
-
|
10
|
-
it "must default #context to Ronin::Web" do
|
11
|
-
expect(subject.context).to be(Ronin::Web)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/spec/html_spec.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web/html'
|
3
|
-
|
4
|
-
describe Ronin::Web::HTML do
|
5
|
-
describe ".parse" do
|
6
|
-
let(:html) do
|
7
|
-
<<~HTML
|
8
|
-
<html>
|
9
|
-
<body>Hello</body>
|
10
|
-
</html>
|
11
|
-
HTML
|
12
|
-
end
|
13
|
-
|
14
|
-
it "must parse an HTML String and return a Nokogiri::HTML::Document" do
|
15
|
-
doc = subject.parse(html)
|
16
|
-
|
17
|
-
expect(doc).to be_kind_of(Nokogiri::HTML::Document)
|
18
|
-
expect(doc.at('body').inner_text).to eq("Hello")
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when given a block" do
|
22
|
-
it "must yield the Nokogiri::HTML::Document object" do
|
23
|
-
expect { |b|
|
24
|
-
subject.parse(html,&b)
|
25
|
-
}.to yield_with_args(Nokogiri::HTML::Document)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe ".build" do
|
31
|
-
it "must build an HTML document" do
|
32
|
-
doc = subject.build do
|
33
|
-
html {
|
34
|
-
body {
|
35
|
-
div { text("hello") }
|
36
|
-
}
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
|
-
expect(doc.to_html).to include("<html><body><div>hello</div></body></html>")
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/spec/mechanize_spec.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web/mechanize'
|
3
|
-
|
4
|
-
describe Ronin::Web::Mechanize do
|
5
|
-
describe "#initialize" do
|
6
|
-
context "when Ronin::Support::Network::HTTP.user_agent is set" do
|
7
|
-
let(:user_agent) { 'test' }
|
8
|
-
|
9
|
-
before { Ronin::Support::Network::HTTP.user_agent = user_agent }
|
10
|
-
|
11
|
-
it "should set #user_agent to Ronin::Support::Network::HTTP.user_agent" do
|
12
|
-
expect(subject.user_agent).to eq(user_agent)
|
13
|
-
end
|
14
|
-
|
15
|
-
after { Ronin::Support::Network::HTTP.user_agent = nil }
|
16
|
-
end
|
17
|
-
|
18
|
-
context "when the :user_agent option is given" do
|
19
|
-
context "and it's a String" do
|
20
|
-
let(:user_agent) { 'test2' }
|
21
|
-
|
22
|
-
subject { described_class.new(user_agent: user_agent) }
|
23
|
-
|
24
|
-
it "should set #user_agent to the custom User-Agent string" do
|
25
|
-
expect(subject.user_agent).to eq(user_agent)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "and it's a Symbol" do
|
30
|
-
let(:user_agent) { :chrome_linux }
|
31
|
-
let(:expected_user_agent) do
|
32
|
-
Ronin::Support::Network::HTTP::UserAgents[user_agent]
|
33
|
-
end
|
34
|
-
|
35
|
-
subject { described_class.new(user_agent: user_agent) }
|
36
|
-
|
37
|
-
it "should set #user_agent to the custom User-Agent alias" do
|
38
|
-
expect(subject.user_agent).to eq(expected_user_agent)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
let(:host) { '127.0.0.1' }
|
44
|
-
let(:port) { 8080 }
|
45
|
-
let(:proxy) { URI::HTTP.build(host: host, port: port) }
|
46
|
-
|
47
|
-
context "when Ronin::Support::Network::HTTP.proxy is set" do
|
48
|
-
before { Ronin::Support::Network::HTTP.proxy = proxy }
|
49
|
-
|
50
|
-
it "should set #proxy_addr and #proxy_port to Ronin::Support::Network::HTTP.proxy" do
|
51
|
-
expect(subject.proxy_addr).to eq(
|
52
|
-
Ronin::Support::Network::HTTP.proxy.host
|
53
|
-
)
|
54
|
-
|
55
|
-
expect(subject.proxy_port).to eq(
|
56
|
-
Ronin::Support::Network::HTTP.proxy.port
|
57
|
-
)
|
58
|
-
end
|
59
|
-
|
60
|
-
after { Ronin::Support::Network::HTTP.proxy = nil }
|
61
|
-
end
|
62
|
-
|
63
|
-
context "when the :proxy option is given" do
|
64
|
-
subject { described_class.new(proxy: proxy) }
|
65
|
-
|
66
|
-
it "should set #proxy_addr and #proxy_port to the custom proxy" do
|
67
|
-
expect(subject.proxy_addr).to eq(host)
|
68
|
-
expect(subject.proxy_port).to eq(port)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/spec/spec_helper.rb
DELETED
data/spec/web_spec.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web'
|
3
|
-
|
4
|
-
describe Ronin::Web do
|
5
|
-
let(:url) { 'https://example.com/' }
|
6
|
-
|
7
|
-
it "should have a VERSION constant" do
|
8
|
-
expect(subject.const_defined?('VERSION')).to eq(true)
|
9
|
-
end
|
10
|
-
|
11
|
-
describe ".html" do
|
12
|
-
it "should be able to parse HTML" do
|
13
|
-
doc = subject.html(%{
|
14
|
-
<html>
|
15
|
-
<body>Hello</body>
|
16
|
-
</html>
|
17
|
-
})
|
18
|
-
|
19
|
-
expect(doc.at('body').inner_text).to eq("Hello")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe ".build_html" do
|
24
|
-
it "should be able to build HTML documents" do
|
25
|
-
doc = subject.build_html do
|
26
|
-
html {
|
27
|
-
body {
|
28
|
-
div { text("hello") }
|
29
|
-
}
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
expect(doc.to_html).to include("<html><body><div>hello</div></body></html>")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe ".xml" do
|
38
|
-
it "should be able to parse XML" do
|
39
|
-
doc = subject.xml(%{
|
40
|
-
<?xml version="1.0"?>
|
41
|
-
<root>
|
42
|
-
<stuff>Hello</stuff>
|
43
|
-
</root>
|
44
|
-
})
|
45
|
-
|
46
|
-
expect(doc.at('stuff').inner_text).to eq("Hello")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe ".build_xml" do
|
51
|
-
it "should be able to build XML documents" do
|
52
|
-
doc = subject.build_xml do
|
53
|
-
root {
|
54
|
-
stuff(name: 'bla') { text("hello") }
|
55
|
-
}
|
56
|
-
end
|
57
|
-
|
58
|
-
expect(doc.to_xml).to include("<root>\n <stuff name=\"bla\">hello</stuff>\n</root>")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe ".open", :network do
|
63
|
-
it "must open URLs as temporary files" do
|
64
|
-
file = subject.open(url)
|
65
|
-
|
66
|
-
expect(file).to be_kind_of(StringIO)
|
67
|
-
expect(file.read).to include("Example Domain")
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe ".agent" do
|
72
|
-
it "must return a #{described_class}::Mechanize object" do
|
73
|
-
expect(subject.agent).to be_kind_of(described_class::Mechanize)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "must return the same object each time" do
|
77
|
-
expect(subject.agent).to be(subject.agent)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe ".get", :network do
|
82
|
-
it "should be able to get Mechanize pages" do
|
83
|
-
page = subject.get(url)
|
84
|
-
|
85
|
-
expect(page.class).to eq(Mechanize::Page)
|
86
|
-
expect(page.uri).to eq(URI(url))
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe ".get_body", :network do
|
91
|
-
it "should be able to get the bodies of Mechanize pages" do
|
92
|
-
body = subject.get_body(url)
|
93
|
-
|
94
|
-
expect(body).to include("Example Domain")
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
data/spec/xml_spec.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web/xml'
|
3
|
-
|
4
|
-
describe Ronin::Web::XML do
|
5
|
-
describe ".parse" do
|
6
|
-
let(:xml) do
|
7
|
-
<<~XML
|
8
|
-
<?xml version="1.0"?>
|
9
|
-
<root>
|
10
|
-
<stuff>Hello</stuff>
|
11
|
-
</root>
|
12
|
-
XML
|
13
|
-
end
|
14
|
-
|
15
|
-
it "must parse an XML String and return a Nokogiri::XML::Document" do
|
16
|
-
doc = subject.parse(xml)
|
17
|
-
|
18
|
-
expect(doc).to be_kind_of(Nokogiri::XML::Document)
|
19
|
-
expect(doc.at('stuff').inner_text).to eq("Hello")
|
20
|
-
end
|
21
|
-
|
22
|
-
context "when given a block" do
|
23
|
-
it "must yield the Nokogiri::XML::Document object" do
|
24
|
-
expect { |b|
|
25
|
-
subject.parse(xml,&b)
|
26
|
-
}.to yield_with_args(Nokogiri::XML::Document)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe ".build" do
|
32
|
-
it "must build an XML document" do
|
33
|
-
doc = subject.build do
|
34
|
-
root {
|
35
|
-
stuff(name: 'bla') { text("hello") }
|
36
|
-
}
|
37
|
-
end
|
38
|
-
|
39
|
-
expect(doc.to_xml).to include("<root>\n <stuff name=\"bla\">hello</stuff>\n</root>")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|