ronin-support 0.4.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +28 -0
  4. data/.ruby-version +1 -0
  5. data/.yardopts +1 -1
  6. data/ChangeLog.md +121 -33
  7. data/Gemfile +17 -18
  8. data/README.md +57 -33
  9. data/Rakefile +10 -3
  10. data/gemspec.yml +16 -7
  11. data/lib/ronin/binary.rb +21 -0
  12. data/lib/ronin/binary/hexdump.rb +20 -0
  13. data/lib/ronin/binary/hexdump/parser.rb +403 -0
  14. data/lib/ronin/binary/struct.rb +567 -0
  15. data/lib/ronin/binary/template.rb +454 -0
  16. data/lib/ronin/extensions.rb +5 -5
  17. data/lib/ronin/extensions/enumerable.rb +5 -5
  18. data/lib/ronin/extensions/file.rb +39 -33
  19. data/lib/ronin/extensions/ip_addr.rb +29 -31
  20. data/lib/ronin/extensions/kernel.rb +5 -5
  21. data/lib/ronin/extensions/meta.rb +5 -5
  22. data/lib/ronin/extensions/regexp.rb +50 -5
  23. data/lib/ronin/extensions/resolv.rb +7 -9
  24. data/lib/ronin/extensions/string.rb +10 -10
  25. data/lib/ronin/formatting.rb +5 -5
  26. data/lib/ronin/formatting/binary.rb +5 -5
  27. data/lib/ronin/formatting/digest.rb +5 -5
  28. data/lib/ronin/formatting/extensions.rb +5 -5
  29. data/lib/ronin/formatting/extensions/binary.rb +7 -5
  30. data/lib/ronin/formatting/extensions/binary/array.rb +61 -0
  31. data/lib/ronin/formatting/extensions/binary/base64.rb +106 -0
  32. data/lib/ronin/formatting/extensions/binary/file.rb +44 -11
  33. data/lib/ronin/formatting/extensions/binary/float.rb +65 -0
  34. data/lib/ronin/formatting/extensions/binary/integer.rb +66 -50
  35. data/lib/ronin/formatting/extensions/binary/string.rb +81 -205
  36. data/lib/ronin/formatting/extensions/digest.rb +5 -5
  37. data/lib/ronin/formatting/extensions/digest/file.rb +5 -5
  38. data/lib/ronin/formatting/extensions/digest/string.rb +5 -5
  39. data/lib/ronin/formatting/extensions/html.rb +5 -5
  40. data/lib/ronin/formatting/extensions/html/integer.rb +9 -13
  41. data/lib/ronin/formatting/extensions/html/string.rb +31 -39
  42. data/lib/ronin/formatting/extensions/http.rb +5 -5
  43. data/lib/ronin/formatting/extensions/http/integer.rb +6 -6
  44. data/lib/ronin/formatting/extensions/http/string.rb +7 -7
  45. data/lib/ronin/formatting/extensions/sql.rb +5 -5
  46. data/lib/ronin/formatting/extensions/sql/string.rb +22 -24
  47. data/lib/ronin/formatting/extensions/text.rb +5 -5
  48. data/lib/ronin/formatting/extensions/text/array.rb +13 -11
  49. data/lib/ronin/formatting/extensions/text/string.rb +70 -13
  50. data/lib/ronin/formatting/html.rb +5 -5
  51. data/lib/ronin/formatting/http.rb +5 -5
  52. data/lib/ronin/formatting/sql.rb +5 -5
  53. data/lib/ronin/formatting/text.rb +5 -5
  54. data/lib/ronin/fuzzing.rb +5 -5
  55. data/lib/ronin/fuzzing/extensions.rb +5 -5
  56. data/lib/ronin/fuzzing/extensions/string.rb +42 -213
  57. data/lib/ronin/fuzzing/fuzzer.rb +110 -0
  58. data/lib/ronin/fuzzing/fuzzing.rb +33 -26
  59. data/lib/ronin/fuzzing/mutator.rb +161 -0
  60. data/lib/ronin/fuzzing/repeater.rb +81 -0
  61. data/lib/ronin/fuzzing/template.rb +133 -0
  62. data/lib/ronin/mixin.rb +2 -2
  63. data/lib/ronin/network.rb +7 -5
  64. data/lib/ronin/network/dns.rb +64 -24
  65. data/lib/ronin/network/esmtp.rb +5 -5
  66. data/lib/ronin/network/extensions.rb +5 -5
  67. data/lib/ronin/network/extensions/dns.rb +5 -5
  68. data/lib/ronin/network/extensions/dns/net.rb +5 -5
  69. data/lib/ronin/network/extensions/esmtp.rb +5 -5
  70. data/lib/ronin/network/extensions/esmtp/net.rb +5 -5
  71. data/lib/ronin/network/extensions/http.rb +5 -5
  72. data/lib/ronin/network/extensions/http/net.rb +5 -5
  73. data/lib/ronin/network/extensions/http/uri/http.rb +5 -5
  74. data/lib/ronin/network/extensions/imap.rb +5 -5
  75. data/lib/ronin/network/extensions/imap/net.rb +5 -5
  76. data/lib/ronin/network/extensions/pop3.rb +5 -5
  77. data/lib/ronin/network/extensions/pop3/net.rb +5 -5
  78. data/lib/ronin/network/extensions/smtp.rb +5 -5
  79. data/lib/ronin/network/extensions/smtp/net.rb +5 -5
  80. data/lib/ronin/network/extensions/ssl.rb +5 -5
  81. data/lib/ronin/network/extensions/ssl/net.rb +5 -5
  82. data/lib/ronin/network/extensions/tcp.rb +5 -5
  83. data/lib/ronin/network/extensions/tcp/net.rb +5 -5
  84. data/lib/ronin/network/extensions/telnet.rb +5 -5
  85. data/lib/ronin/network/extensions/telnet/net.rb +5 -5
  86. data/lib/ronin/network/extensions/udp.rb +5 -5
  87. data/lib/ronin/network/extensions/udp/net.rb +5 -5
  88. data/lib/ronin/network/ftp.rb +149 -0
  89. data/lib/ronin/network/http.rb +5 -5
  90. data/lib/ronin/network/http/exceptions.rb +5 -5
  91. data/lib/ronin/network/http/exceptions/unknown_request.rb +5 -5
  92. data/lib/ronin/network/http/http.rb +65 -70
  93. data/lib/ronin/network/http/proxy.rb +5 -5
  94. data/lib/ronin/network/imap.rb +16 -15
  95. data/lib/ronin/network/mixins.rb +6 -5
  96. data/lib/ronin/network/mixins/dns.rb +5 -5
  97. data/lib/ronin/network/mixins/esmtp.rb +5 -5
  98. data/lib/ronin/network/mixins/ftp.rb +155 -0
  99. data/lib/ronin/network/mixins/http.rb +58 -587
  100. data/lib/ronin/network/mixins/imap.rb +5 -5
  101. data/lib/ronin/network/mixins/mixin.rb +5 -5
  102. data/lib/ronin/network/mixins/pop3.rb +5 -5
  103. data/lib/ronin/network/mixins/smtp.rb +5 -5
  104. data/lib/ronin/network/mixins/ssl.rb +5 -5
  105. data/lib/ronin/network/mixins/tcp.rb +43 -10
  106. data/lib/ronin/network/mixins/telnet.rb +5 -5
  107. data/lib/ronin/network/mixins/udp.rb +126 -6
  108. data/lib/ronin/network/mixins/unix.rb +279 -0
  109. data/lib/ronin/network/network.rb +5 -5
  110. data/lib/ronin/network/pop3.rb +10 -10
  111. data/lib/ronin/network/proxy.rb +578 -0
  112. data/lib/ronin/network/smtp.rb +5 -5
  113. data/lib/ronin/network/smtp/email.rb +6 -6
  114. data/lib/ronin/network/smtp/smtp.rb +12 -13
  115. data/lib/ronin/network/ssl.rb +16 -17
  116. data/lib/ronin/network/tcp.rb +7 -310
  117. data/lib/ronin/network/tcp/proxy.rb +417 -0
  118. data/lib/ronin/network/tcp/tcp.rb +452 -0
  119. data/lib/ronin/network/telnet.rb +34 -28
  120. data/lib/ronin/network/udp.rb +7 -271
  121. data/lib/ronin/network/udp/proxy.rb +191 -0
  122. data/lib/ronin/network/udp/udp.rb +452 -0
  123. data/lib/ronin/network/unix.rb +286 -0
  124. data/lib/ronin/path.rb +35 -39
  125. data/lib/ronin/spec/ui/output.rb +6 -12
  126. data/lib/ronin/support.rb +6 -5
  127. data/lib/ronin/support/inflector.rb +8 -12
  128. data/lib/ronin/support/support.rb +7 -5
  129. data/lib/ronin/support/version.rb +6 -6
  130. data/lib/ronin/templates.rb +5 -5
  131. data/lib/ronin/templates/erb.rb +5 -5
  132. data/lib/ronin/templates/template.rb +5 -5
  133. data/lib/ronin/ui/output.rb +5 -5
  134. data/lib/ronin/ui/output/helpers.rb +42 -28
  135. data/lib/ronin/ui/output/output.rb +17 -21
  136. data/lib/ronin/ui/output/terminal.rb +5 -5
  137. data/lib/ronin/ui/output/terminal/color.rb +15 -9
  138. data/lib/ronin/ui/output/terminal/raw.rb +5 -5
  139. data/lib/ronin/ui/shell.rb +8 -11
  140. data/lib/ronin/wordlist.rb +110 -30
  141. data/ronin-support.gemspec +39 -109
  142. data/spec/binary/hexdump/helpers/hexdumps.rb +13 -0
  143. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/ascii.bin +0 -0
  144. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -0
  145. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_bytes.txt +0 -0
  146. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_shorts.txt +0 -0
  147. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_bytes.txt +0 -0
  148. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_shorts.txt +0 -0
  149. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_repeated.txt +0 -0
  150. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_bytes.txt +0 -0
  151. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_ints.txt +0 -0
  152. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_quads.txt +0 -0
  153. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_shorts.txt +0 -0
  154. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +17 -0
  155. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +17 -0
  156. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_bytes.txt +0 -0
  157. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_ints.txt +0 -0
  158. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_quads.txt +0 -0
  159. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_shorts.txt +0 -0
  160. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +17 -0
  161. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_bytes.txt +0 -0
  162. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_ints.txt +0 -0
  163. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_quads.txt +0 -0
  164. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_shorts.txt +0 -0
  165. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_repeated.txt +0 -0
  166. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/repeated.bin +0 -0
  167. data/spec/binary/hexdump/parser_spec.rb +302 -0
  168. data/spec/binary/struct_spec.rb +496 -0
  169. data/spec/binary/template_spec.rb +416 -0
  170. data/spec/extensions/enumerable_spec.rb +4 -4
  171. data/spec/extensions/file_spec.rb +12 -14
  172. data/spec/extensions/ip_addr_spec.rb +76 -50
  173. data/spec/extensions/kernel_spec.rb +7 -7
  174. data/spec/extensions/regexp_spec.rb +119 -59
  175. data/spec/extensions/resolv_spec.rb +2 -2
  176. data/spec/extensions/string_spec.rb +31 -30
  177. data/spec/formatting/binary/array_spec.rb +26 -0
  178. data/spec/formatting/binary/base64_spec.rb +50 -0
  179. data/spec/formatting/binary/float_spec.rb +36 -0
  180. data/spec/formatting/binary/integer_spec.rb +76 -50
  181. data/spec/formatting/binary/string_spec.rb +91 -198
  182. data/spec/formatting/digest/string_spec.rb +5 -5
  183. data/spec/formatting/html/integer_spec.rb +6 -6
  184. data/spec/formatting/html/string_spec.rb +10 -10
  185. data/spec/formatting/http/integer_spec.rb +3 -3
  186. data/spec/formatting/http/string_spec.rb +5 -5
  187. data/spec/formatting/sql/string_spec.rb +21 -19
  188. data/spec/formatting/text/array_spec.rb +15 -15
  189. data/spec/formatting/text/string_spec.rb +58 -28
  190. data/spec/fuzzing/extensions/string_spec.rb +87 -0
  191. data/spec/fuzzing/fuzzer_spec.rb +109 -0
  192. data/spec/fuzzing/fuzzing_spec.rb +24 -0
  193. data/spec/fuzzing/mutator_spec.rb +112 -0
  194. data/spec/fuzzing/repeater_spec.rb +57 -0
  195. data/spec/fuzzing/template_spec.rb +54 -0
  196. data/spec/mixin_spec.rb +10 -12
  197. data/spec/network/dns_spec.rb +89 -23
  198. data/spec/network/ftp_spec.rb +81 -0
  199. data/spec/network/http/http_spec.rb +237 -144
  200. data/spec/network/http/proxy_spec.rb +37 -37
  201. data/spec/network/network_spec.rb +2 -2
  202. data/spec/network/proxy_spec.rb +121 -0
  203. data/spec/network/shared/unix_server.rb +31 -0
  204. data/spec/network/smtp/email_spec.rb +14 -14
  205. data/spec/network/ssl_spec.rb +53 -3
  206. data/spec/network/tcp/proxy_spec.rb +118 -0
  207. data/spec/network/tcp/tcp_spec.rb +316 -0
  208. data/spec/network/telnet_spec.rb +67 -0
  209. data/spec/network/udp/udp_spec.rb +298 -0
  210. data/spec/network/unix_spec.rb +182 -0
  211. data/spec/path_spec.rb +43 -18
  212. data/spec/spec_helper.rb +2 -3
  213. data/spec/support/inflector_spec.rb +4 -4
  214. data/spec/support_spec.rb +1 -1
  215. data/spec/templates/erb_spec.rb +3 -3
  216. data/spec/templates/template_spec.rb +10 -10
  217. data/spec/ui/shell_spec.rb +15 -15
  218. data/spec/wordlist_spec.rb +80 -19
  219. metadata +176 -121
  220. data/.gemtest +0 -0
  221. data/spec/formatting/binary/helpers/hexdumps.rb +0 -16
  222. data/spec/fuzzing/string_spec.rb +0 -158
  223. data/spec/network/tcp_spec.rb +0 -247
  224. data/spec/network/udp_spec.rb +0 -248
data/spec/path_spec.rb CHANGED
@@ -7,45 +7,52 @@ describe Path do
7
7
  let(:n) { 7 }
8
8
 
9
9
  it "should inherit from Pathname" do
10
- subject.superclass.should == Pathname
10
+ expect(subject.superclass).to eq(Pathname)
11
11
  end
12
12
 
13
- it "should provide the root path" do
14
- path = subject.root
13
+ describe "#initialize" do
14
+ it "should accept a separator argument" do
15
+ path = described_class.new('foo',"\\")
15
16
 
16
- path.should.class == Path
17
- path.to_s.should == '/'
17
+ expect(path.separator).to eq("\\")
18
+ end
19
+
20
+ it "should default the separator to File::SEPARATOR" do
21
+ path = described_class.new('foo')
22
+
23
+ expect(path.separator).to eq(File::SEPARATOR)
24
+ end
18
25
  end
19
26
 
20
27
  describe "up" do
21
28
  it "should be able to traverse up 0 directories" do
22
- subject.up(0).should == File::SEPARATOR
29
+ expect(subject.up(0)).to eq(File::SEPARATOR)
23
30
  end
24
31
 
25
32
  it "should raise an ArgumentError when not passed an Integer or Enumerable" do
26
- lambda {
33
+ expect {
27
34
  subject.up(1.5)
28
- }.should raise_error(ArgumentError)
35
+ }.to raise_error(ArgumentError)
29
36
  end
30
37
 
31
38
  it "should raise an ArgumentError on negative number of directories" do
32
- lambda {
39
+ expect {
33
40
  subject.up(-1)
34
- }.should raise_error(ArgumentError)
41
+ }.to raise_error(ArgumentError)
35
42
  end
36
43
 
37
44
  it "should create directory-escaping paths" do
38
- subject.up(n).to_s.should == (['..'] * n).join(File::SEPARATOR)
45
+ expect(subject.up(n).to_s).to eq((['..'] * n).join(File::SEPARATOR))
39
46
  end
40
47
 
41
48
  it "should create a range of directory-escaping paths" do
42
49
  range = 7..10
43
50
 
44
- subject.up(range).should == range.map { |i| Path.up(i) }
51
+ expect(subject.up(range)).to eq(range.map { |i| Path.up(i) })
45
52
  end
46
53
 
47
54
  it "should allow using custom path separators" do
48
- subject.up(n,'\\').to_s.should == (['..'] * n).join("\\")
55
+ expect(subject.up(n,'\\').to_s).to eq((['..'] * n).join("\\"))
49
56
  end
50
57
  end
51
58
 
@@ -56,31 +63,49 @@ describe Path do
56
63
  sub_path = File.join('one','two')
57
64
  expected = [subject, sub_path].join(File::SEPARATOR)
58
65
 
59
- subject.join(sub_path).to_s.should == expected
66
+ expect(subject.join(sub_path).to_s).to eq(expected)
60
67
  end
61
68
 
62
69
  it "should join with a sub-directory" do
63
70
  sub_directory = 'three'
64
71
  expected = [subject, sub_directory].join(File::SEPARATOR)
65
72
 
66
- subject.join(sub_directory).to_s.should == expected
73
+ expect(subject.join(sub_directory).to_s).to eq(expected)
67
74
  end
68
75
 
69
76
  it "should not collapse directory traversals" do
70
77
  traversal = Path.up(n)
71
78
  expected = [subject, traversal].join(File::SEPARATOR)
72
79
 
73
- subject.join(traversal).to_s.should == expected
80
+ expect(subject.join(traversal).to_s).to eq(expected)
81
+ end
82
+
83
+ it "should filter out leading directory separators" do
84
+ expected = [subject, 'sub'].join(File::SEPARATOR)
85
+
86
+ expect(subject.join('/','sub','/').to_s).to eq(expected)
74
87
  end
75
88
 
76
89
  it "should filter out extra directory separators" do
77
90
  expected = [subject, 'sub'].join(File::SEPARATOR)
78
91
 
79
- subject.join('/','sub','/').to_s.should == expected
92
+ expect(subject.join('/sub').to_s).to eq(expected)
80
93
  end
81
94
 
82
95
  it "should join with the root path" do
83
- Path.root.join('etc','passwd').to_s.should == '/etc/passwd'
96
+ expect(Path.root.join('etc','passwd').to_s).to eq('/etc/passwd')
97
+ end
98
+
99
+ context "with a custom path seperator" do
100
+ let(:separator) { "\\" }
101
+
102
+ subject { described_class.new('foo',separator) }
103
+
104
+ it "should pass the path separator to the new path" do
105
+ new_path = subject.join('bar','baz')
106
+
107
+ expect(new_path.separator).to eq(separator)
108
+ end
84
109
  end
85
110
  end
86
111
  end
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,6 @@ require 'ronin/support/version'
3
3
 
4
4
  include Ronin
5
5
 
6
- RSpec.configure do |config|
7
- config.treat_symbols_as_metadata_keys_with_true_values = true
8
- config.filter_run_excluding :network
6
+ RSpec.configure do |specs|
7
+ specs.filter_run_excluding :network
9
8
  end
@@ -5,18 +5,18 @@ describe "Ronin::Support::Inflector" do
5
5
  subject { Ronin::Support::Inflector }
6
6
 
7
7
  it "should not be nil" do
8
- subject.should_not be_nil
8
+ expect(subject).not_to be_nil
9
9
  end
10
10
 
11
11
  it "should support pluralizing words" do
12
- subject.pluralize('word').should == 'words'
12
+ expect(subject.pluralize('word')).to eq('words')
13
13
  end
14
14
 
15
15
  it "should support singularizing words" do
16
- subject.singularize('words').should == 'word'
16
+ expect(subject.singularize('words')).to eq('word')
17
17
  end
18
18
 
19
19
  it "should support humanizing words" do
20
- subject.humanize('word_id').should == 'Word'
20
+ expect(subject.humanize('word_id')).to eq('Word')
21
21
  end
22
22
  end
data/spec/support_spec.rb CHANGED
@@ -3,6 +3,6 @@ require 'ronin/support/version'
3
3
 
4
4
  describe Support do
5
5
  it "should have a version" do
6
- subject.const_defined?('VERSION').should == true
6
+ expect(subject.const_defined?('VERSION')).to be(true)
7
7
  end
8
8
  end
@@ -6,16 +6,16 @@ require 'templates/classes/example_erb'
6
6
  describe Templates::Erb do
7
7
  subject { ExampleErb.new }
8
8
 
9
- before(:all) do
9
+ before do
10
10
  subject.x = 2
11
11
  subject.y = 3
12
12
  end
13
13
 
14
14
  it "should render inline ERB templates" do
15
- subject.erb(%{<%= 'hello' %>}).should == 'hello'
15
+ expect(subject.erb(%{<%= 'hello' %>})).to eq('hello')
16
16
  end
17
17
 
18
18
  it "should render ERB templates using the binding of the object" do
19
- subject.erb(%{<%= @x %> <%= @y %>}).should == '2 3'
19
+ expect(subject.erb(%{<%= @x %> <%= @y %>})).to eq('2 3')
20
20
  end
21
21
  end
@@ -11,44 +11,44 @@ describe Templates::Template do
11
11
  subject { ExampleTemplate.new }
12
12
 
13
13
  it "should return the result of the block when entering a template" do
14
- subject.enter_example_template { |path|
14
+ expect(subject.enter_example_template { |path|
15
15
  'result'
16
- }.should == 'result'
16
+ }).to eq('result')
17
17
  end
18
18
 
19
19
  it "should be able to find templates relative to the current one" do
20
20
  subject.enter_example_template do |path|
21
- path.should == example_template
21
+ expect(path).to eq(example_template)
22
22
  end
23
23
  end
24
24
 
25
25
  it "should be able to find static templates" do
26
26
  subject.enter_relative_template do |path|
27
- path.should == relative_template
27
+ expect(path).to eq(relative_template)
28
28
  end
29
29
  end
30
30
 
31
31
  it "should raise a RuntimeError when entering an unknown template" do
32
- lambda {
32
+ expect {
33
33
  subject.enter_missing_template { |path| }
34
- }.should raise_error(RuntimeError)
34
+ }.to raise_error(RuntimeError)
35
35
  end
36
36
 
37
37
  it "should be able to read templates relative to the current one" do
38
38
  subject.read_example_template do |contents|
39
- contents.should == File.read(example_template)
39
+ expect(contents).to eq(File.read(example_template))
40
40
  end
41
41
  end
42
42
 
43
43
  it "should be able to find static templates" do
44
44
  subject.read_relative_template do |contents|
45
- contents.should == File.read(relative_template)
45
+ expect(contents).to eq(File.read(relative_template))
46
46
  end
47
47
  end
48
48
 
49
49
  it "should raise a RuntimeError when entering an unknown template" do
50
- lambda {
50
+ expect {
51
51
  subject.read_missing_template { |path| }
52
- }.should raise_error(RuntimeError)
52
+ }.to raise_error(RuntimeError)
53
53
  end
54
54
  end
@@ -13,7 +13,7 @@ describe UI::Shell do
13
13
 
14
14
  shell.call(line)
15
15
 
16
- lines.should == [line]
16
+ expect(lines).to eq([line])
17
17
  end
18
18
  end
19
19
 
@@ -22,11 +22,11 @@ describe UI::Shell do
22
22
 
23
23
  describe "#commands" do
24
24
  it "should include builtin methods" do
25
- subject.commands.should include('help', 'exit')
25
+ expect(subject.commands).to include('help', 'exit')
26
26
  end
27
27
 
28
28
  it "should include protected methods" do
29
- subject.commands.should include(
29
+ expect(subject.commands).to include(
30
30
  'command1',
31
31
  'command_with_arg',
32
32
  'command_with_args'
@@ -34,49 +34,49 @@ describe UI::Shell do
34
34
  end
35
35
 
36
36
  it "should not include public methods" do
37
- subject.commands.should_not include('a_public_method')
37
+ expect(subject.commands).not_to include('a_public_method')
38
38
  end
39
39
  end
40
40
 
41
41
  describe "#call" do
42
42
  it "should ignore empty lines" do
43
- subject.call('').should == false
43
+ expect(subject.call('')).to be(false)
44
44
  end
45
45
 
46
46
  it "should ignore white-space lines" do
47
- subject.call(" \t ").should == false
47
+ expect(subject.call(" \t ")).to be(false)
48
48
  end
49
49
 
50
50
  it "should not allow calling the handler method" do
51
- subject.call('handler').should == false
51
+ expect(subject.call('handler')).to be(false)
52
52
  end
53
53
 
54
54
  it "should not allow calling unknown commands" do
55
- subject.call('an_unknown_command').should == false
55
+ expect(subject.call('an_unknown_command')).to be(false)
56
56
  end
57
57
 
58
58
  it "should not allow calling unknown commands" do
59
- subject.call('an_unknown_command').should == false
59
+ expect(subject.call('an_unknown_command')).to be(false)
60
60
  end
61
61
 
62
62
  it "should not allow calling public methods" do
63
- subject.call('a_public_method').should == false
63
+ expect(subject.call('a_public_method')).to be(false)
64
64
  end
65
65
 
66
66
  it "should allow calling protected methods" do
67
- subject.call('command1').should == :command1
67
+ expect(subject.call('command1')).to eq(:command1)
68
68
  end
69
69
 
70
70
  it "should raise an exception when passing invalid number of arguments" do
71
- lambda {
71
+ expect {
72
72
  subject.call('command_with_arg too many args')
73
- }.should raise_error(ArgumentError)
73
+ }.to raise_error(ArgumentError)
74
74
  end
75
75
 
76
76
  it "should splat the command arguments to the command method" do
77
- subject.call('command_with_args one two three').should == [
77
+ expect(subject.call('command_with_args one two three')).to eq([
78
78
  'one', 'two', 'three'
79
- ]
79
+ ])
80
80
  end
81
81
  end
82
82
  end
@@ -1,16 +1,15 @@
1
1
  require 'spec_helper'
2
2
  require 'ronin/wordlist'
3
3
 
4
- require 'tempfile'
4
+ require 'tmpdir'
5
5
 
6
6
  describe Wordlist do
7
7
  let(:words) { %w[foo bar baz] }
8
+ let(:path) { File.join(Dir.tmpdir,'ronin-support-wordlist') }
8
9
 
9
- before(:all) do
10
- Tempfile.open('ronin-support-wordlist') do |file|
11
- words.each { |word| file.puts word }
12
-
13
- @path = file.path
10
+ before do
11
+ File.open(path,'w') do |file|
12
+ file.puts(*words)
14
13
  end
15
14
  end
16
15
 
@@ -37,29 +36,74 @@ describe Wordlist do
37
36
 
38
37
  subject.parse(text) { |word| seen << word }
39
38
 
40
- seen.should =~ words
39
+ expect(seen).to match_array(words)
40
+ end
41
+ end
42
+
43
+ describe "create" do
44
+ let(:created_path) { File.join(Dir.tmpdir,'ronin-support-created-wordlist') }
45
+ let(:text) { words.join(' ') }
46
+
47
+ it "should return the new Wordlist object" do
48
+ wordlist = described_class.create(created_path,text)
49
+
50
+ expect(wordlist.to_a).to match_array(words)
51
+ end
52
+
53
+ it "should create a wordlist file from text" do
54
+ described_class.create(created_path,text)
55
+
56
+ saved_words = File.open(created_path).each_line.map(&:chomp)
57
+
58
+ expect(saved_words).to match_array(words)
59
+ end
60
+
61
+ it "should apply mutations to the created wordlist" do
62
+ described_class.create(created_path,text, 'o' => ['0'])
63
+
64
+ saved_words = File.open(created_path).each_line.map(&:chomp)
65
+
66
+ expect(saved_words).to match_array(%w[foo f0o fo0 f00 bar baz])
41
67
  end
68
+
69
+ after { FileUtils.rm(created_path) }
42
70
  end
43
71
 
44
72
  describe "#initialize" do
45
73
  it "should accept a list of words" do
46
- subject.to_a.should == words
74
+ wordlist = described_class.new(path)
75
+
76
+ expect(wordlist.to_a).to eq(words)
47
77
  end
48
78
 
49
79
  it "should accept a path to a wordlist file" do
50
- file = described_class.new(@path)
80
+ wordlist = described_class.new(path)
51
81
 
52
- file.to_a.should == words
82
+ expect(wordlist.to_a).to eq(words)
83
+ end
84
+
85
+ it "should raise a TypeError for non-String / non-Enumerable objects" do
86
+ expect {
87
+ described_class.new(Object.new)
88
+ }.to raise_error(TypeError)
53
89
  end
54
90
  end
55
91
 
56
92
  describe "#each_word" do
57
- it "should raise a TypeError for non-String / non-Enumerable objects" do
58
- wordlist = described_class.new(Object.new)
93
+ context "with wordlist file" do
94
+ subject { described_class.new(path) }
59
95
 
60
- lambda {
61
- wordlist.each_word { |word| }
62
- }.should raise_error(TypeError)
96
+ it "should enumerate over the words" do
97
+ expect(subject.each_word.to_a).to eq(words)
98
+ end
99
+ end
100
+
101
+ context "with words" do
102
+ subject { described_class.new(words) }
103
+
104
+ it "should enumerate over the words" do
105
+ expect(subject.each_word.to_a).to eq(words)
106
+ end
63
107
  end
64
108
  end
65
109
 
@@ -67,24 +111,41 @@ describe Wordlist do
67
111
  it "should rewind file lists" do
68
112
  subject.each { |word| }
69
113
 
70
- subject.to_a.should == words
114
+ expect(subject.to_a).to eq(words)
71
115
  end
72
116
 
73
117
  it "should apply additional mutation rules" do
74
118
  wordlist = described_class.new(words)
75
119
  wordlist.mutations['o'] = ['0']
76
120
 
77
- wordlist.to_a.should =~ %w[foo f0o fo0 f00 bar baz]
121
+ expect(wordlist.to_a).to match_array(%w[foo f0o fo0 f00 bar baz])
78
122
  end
79
123
  end
80
124
 
81
125
  describe "#each_n_words" do
82
126
  it "should enumerate over every combination of N words" do
83
- subject.each_n_words(2).to_a.should == %w[
127
+ expect(subject.each_n_words(2).to_a).to eq(%w[
84
128
  foofoo foobar foobaz
85
129
  barfoo barbar barbaz
86
130
  bazfoo bazbar bazbaz
87
- ]
131
+ ])
88
132
  end
89
133
  end
134
+
135
+ describe "#save" do
136
+ let(:saved_path) { File.join(Dir.tmpdir,'ronin-support-saved-wordlist') }
137
+
138
+ it "should save the words with mutations to a file" do
139
+ subject.save(saved_path)
140
+
141
+ saved_words = File.open(saved_path).each_line.map(&:chomp)
142
+ expected_words = subject.to_a
143
+
144
+ expect(saved_words).to eq(expected_words)
145
+ end
146
+
147
+ after { FileUtils.rm(saved_path) }
148
+ end
149
+
150
+ after { FileUtils.rm(path) }
90
151
  end