ronin-support 0.1.0 → 0.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +24 -0
- data/Gemfile +9 -1
- data/README.md +6 -3
- data/gemspec.yml +3 -1
- data/lib/ronin/extensions.rb +2 -1
- data/lib/ronin/extensions/file.rb +4 -0
- data/lib/ronin/extensions/ip_addr.rb +8 -0
- data/lib/ronin/extensions/kernel.rb +2 -0
- data/lib/ronin/extensions/string.rb +50 -11
- data/lib/ronin/formatting/extensions/binary.rb +2 -0
- data/lib/ronin/formatting/extensions/binary/file.rb +12 -1
- data/lib/ronin/formatting/extensions/binary/integer.rb +6 -0
- data/lib/ronin/formatting/extensions/binary/string.rb +20 -0
- data/lib/ronin/formatting/extensions/digest/file.rb +14 -0
- data/lib/ronin/formatting/extensions/digest/string.rb +8 -0
- data/lib/ronin/formatting/extensions/html.rb +21 -0
- data/lib/ronin/formatting/extensions/html/integer.rb +126 -0
- data/lib/ronin/formatting/extensions/html/string.rb +184 -0
- data/lib/ronin/formatting/extensions/http/integer.rb +7 -1
- data/lib/ronin/formatting/extensions/http/string.rb +10 -0
- data/lib/ronin/formatting/extensions/text.rb +2 -0
- data/lib/ronin/formatting/extensions/text/array.rb +10 -0
- data/lib/ronin/formatting/extensions/text/string.rb +44 -12
- data/lib/ronin/formatting/html.rb +20 -0
- data/lib/ronin/mixin.rb +89 -0
- data/lib/ronin/network/extensions/esmtp/net.rb +6 -0
- data/lib/ronin/network/extensions/http/net.rb +124 -51
- data/lib/ronin/network/extensions/imap/net.rb +4 -0
- data/lib/ronin/network/extensions/pop3/net.rb +4 -0
- data/lib/ronin/network/extensions/smtp/net.rb +73 -2
- data/lib/ronin/network/extensions/ssl/net.rb +4 -0
- data/lib/ronin/network/extensions/tcp/net.rb +16 -0
- data/lib/ronin/network/extensions/telnet/net.rb +4 -0
- data/lib/ronin/network/extensions/udp/net.rb +12 -0
- data/lib/ronin/network/http/http.rb +50 -29
- data/lib/ronin/network/http/proxy.rb +26 -0
- data/lib/ronin/network/imap.rb +4 -0
- data/lib/ronin/network/network.rb +2 -0
- data/lib/ronin/network/pop3.rb +4 -0
- data/lib/ronin/network/smtp/email.rb +43 -14
- data/lib/ronin/network/smtp/smtp.rb +6 -0
- data/lib/ronin/network/ssl.rb +2 -0
- data/lib/ronin/network/telnet.rb +16 -0
- data/lib/ronin/path.rb +6 -0
- data/lib/ronin/support/inflector.rb +3 -1
- data/lib/ronin/support/version.rb +1 -1
- data/lib/ronin/templates/erb.rb +4 -0
- data/lib/ronin/templates/template.rb +10 -0
- data/spec/extensions/string_spec.rb +4 -4
- data/spec/formatting/html/integer_spec.rb +66 -0
- data/spec/formatting/html/string_spec.rb +103 -0
- data/spec/formatting/http/string_spec.rb +1 -1
- data/spec/formatting/text/string_spec.rb +18 -66
- data/spec/mixin_spec.rb +53 -0
- data/spec/network/http/http_spec.rb +0 -7
- data/spec/network/http/proxy_spec.rb +2 -2
- data/spec/network/smtp/email_spec.rb +100 -0
- data/spec/path_spec.rb +13 -13
- data/spec/templates/helpers/data.rb +1 -1
- metadata +52 -33
@@ -37,6 +37,8 @@ module Ronin
|
|
37
37
|
# @return [Array]
|
38
38
|
# The stack of directory paths.
|
39
39
|
#
|
40
|
+
# @api semipublic
|
41
|
+
#
|
40
42
|
def template_dirs
|
41
43
|
@template_dirs ||= []
|
42
44
|
end
|
@@ -49,6 +51,8 @@ module Ronin
|
|
49
51
|
# Returns the first path in {#template_dirs}, or `nil` if
|
50
52
|
# {#template_dirs} is empty.
|
51
53
|
#
|
54
|
+
# @api semipublic
|
55
|
+
#
|
52
56
|
def template_dir
|
53
57
|
template_dirs.first
|
54
58
|
end
|
@@ -68,6 +72,8 @@ module Ronin
|
|
68
72
|
# @example
|
69
73
|
# find_template 'sub/path/template.erb'
|
70
74
|
#
|
75
|
+
# @api semipublic
|
76
|
+
#
|
71
77
|
def find_template(sub_path)
|
72
78
|
sub_path = sub_path.to_s
|
73
79
|
|
@@ -107,6 +113,8 @@ module Ronin
|
|
107
113
|
# # do stuff with the full path
|
108
114
|
# end
|
109
115
|
#
|
116
|
+
# @api semipublic
|
117
|
+
#
|
110
118
|
def enter_template(sub_path)
|
111
119
|
sub_path = sub_path.to_s
|
112
120
|
|
@@ -143,6 +151,8 @@ module Ronin
|
|
143
151
|
# # ...
|
144
152
|
# end
|
145
153
|
#
|
154
|
+
# @api semipublic
|
155
|
+
#
|
146
156
|
def read_template(template_path)
|
147
157
|
enter_template(template_path) do |path|
|
148
158
|
contents = File.read(path)
|
@@ -107,27 +107,27 @@ describe String do
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
describe "#
|
110
|
+
describe "#common_suffix" do
|
111
111
|
it "should find the common postfix between two Strings" do
|
112
112
|
one = 'Tell me baby whats my name'
|
113
113
|
two = "Can't you guess my name"
|
114
114
|
common = 's my name'
|
115
115
|
|
116
|
-
one.
|
116
|
+
one.common_suffix(two).should == common
|
117
117
|
end
|
118
118
|
|
119
119
|
it "should return an empty String if there is no common postfix" do
|
120
120
|
one = 'You got to right up, stand up'
|
121
121
|
two = 'stand up for your rights'
|
122
122
|
|
123
|
-
one.
|
123
|
+
one.common_suffix(two).should == ''
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should return an empty String if one of the strings is also empty" do
|
127
127
|
one = 'You and I must fight for our rights'
|
128
128
|
two = ''
|
129
129
|
|
130
|
-
one.
|
130
|
+
one.common_suffix(two).should == ''
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ronin/formatting/extensions/html/integer'
|
3
|
+
|
4
|
+
describe Integer do
|
5
|
+
subject { 0x26 }
|
6
|
+
|
7
|
+
it "should provide String#html_escape" do
|
8
|
+
should respond_to(:html_escape)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should provide String#format_html" do
|
12
|
+
should respond_to(:format_html)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should provide String#js_escape" do
|
16
|
+
should respond_to(:js_escape)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should provide String#format_js" do
|
20
|
+
should respond_to(:format_js)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#html_escape" do
|
24
|
+
let(:html_escaped) { "&" }
|
25
|
+
|
26
|
+
it "should HTML escape itself" do
|
27
|
+
subject.html_escape.should == html_escaped
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#format_html" do
|
32
|
+
let(:formatted_html) { "&" }
|
33
|
+
|
34
|
+
it "should HTML format all chars" do
|
35
|
+
subject.format_html.should == formatted_html
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#js_escape" do
|
40
|
+
let(:special_byte) { 0x0a }
|
41
|
+
let(:escaped_special_byte) { '\n' }
|
42
|
+
|
43
|
+
let(:normal_byte) { 0x41 }
|
44
|
+
let(:normal_char) { 'A' }
|
45
|
+
|
46
|
+
it "should escape special JavaScript characters" do
|
47
|
+
special_byte.js_escape.should == escaped_special_byte
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should ignore normal characters" do
|
51
|
+
normal_byte.js_escape.should == normal_char
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#format_js" do
|
56
|
+
let(:js_escaped) { "%26" }
|
57
|
+
|
58
|
+
it "should JavaScript format ascii bytes" do
|
59
|
+
subject.format_js.should == js_escaped
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should JavaScript format unicode bytes" do
|
63
|
+
0xd556.format_js.should == "%uD556"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ronin/formatting/extensions/html/string'
|
3
|
+
|
4
|
+
describe String do
|
5
|
+
subject { "one & two" }
|
6
|
+
|
7
|
+
it "should provide String#html_escape" do
|
8
|
+
should respond_to(:html_escape)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should provide String#html_unescape" do
|
12
|
+
should respond_to(:html_unescape)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should provide String#format_html" do
|
16
|
+
should respond_to(:format_html)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should provide String#js_escape" do
|
20
|
+
should respond_to(:js_escape)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should provide String#js_unescape" do
|
24
|
+
should respond_to(:js_unescape)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should provide String#format_js" do
|
28
|
+
should respond_to(:format_js)
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#html_escape" do
|
32
|
+
let(:html_escaped) { "one & two" }
|
33
|
+
|
34
|
+
it "should HTML escape itself" do
|
35
|
+
subject.html_escape.should == html_escaped
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#html_unescape" do
|
40
|
+
let(:html_escaped) { "one & two" }
|
41
|
+
|
42
|
+
it "should HTML unescape itself" do
|
43
|
+
html_escaped.html_unescape.should == subject
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#format_html" do
|
48
|
+
let(:formatted_html) do
|
49
|
+
"one & two"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should HTML format all chars" do
|
53
|
+
subject.format_html.should == formatted_html
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#js_escape" do
|
58
|
+
let(:special_chars) { "\t\n\r" }
|
59
|
+
let(:escaped_special_chars) { '\t\n\r' }
|
60
|
+
|
61
|
+
let(:normal_chars) { "abc" }
|
62
|
+
|
63
|
+
it "should escape special JavaScript characters" do
|
64
|
+
special_chars.js_escape.should == escaped_special_chars
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should ignore normal characters" do
|
68
|
+
normal_chars.js_escape.should == normal_chars
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#js_unescape" do
|
73
|
+
let(:js_unicode) do
|
74
|
+
"%u006F%u006E%u0065%u0020%u0026%u0020%u0074%u0077%u006F"
|
75
|
+
end
|
76
|
+
let(:js_hex) { "%6F%6E%65%20%26%20%74%77%6F" }
|
77
|
+
let(:js_mixed) { "one %26 two" }
|
78
|
+
|
79
|
+
it "should unescape JavaScript unicode characters" do
|
80
|
+
js_unicode.js_unescape.should == subject
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should unescape JavaScript hex characters" do
|
84
|
+
js_hex.js_unescape.should == subject
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should unescape backslash-escaped characters" do
|
88
|
+
"\\b\\t\\n\\f\\r\\\"\\\\".js_unescape.should == "\b\t\n\f\r\"\\"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should ignore non-escaped characters" do
|
92
|
+
js_mixed.js_unescape.should == subject
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#format_js" do
|
97
|
+
let(:js_formatted) { "%6F%6E%65%20%26%20%74%77%6F" }
|
98
|
+
|
99
|
+
it "should JavaScript escape all characters" do
|
100
|
+
subject.format_js.should == js_formatted
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -67,7 +67,7 @@ describe String do
|
|
67
67
|
describe "#format_http" do
|
68
68
|
subject { "mod % 3" }
|
69
69
|
|
70
|
-
let(:http_formatted) { "%
|
70
|
+
let(:http_formatted) { "%6D%6F%64%20%25%20%33" }
|
71
71
|
|
72
72
|
it "should format each byte of the String" do
|
73
73
|
subject.format_http.should == http_formatted
|
@@ -24,62 +24,6 @@ describe String do
|
|
24
24
|
should respond_to(:insert_after)
|
25
25
|
end
|
26
26
|
|
27
|
-
describe "#format_chars" do
|
28
|
-
it "should format each character in the String" do
|
29
|
-
subject.format_chars { |c|
|
30
|
-
"_#{c}"
|
31
|
-
}.should == "_h_e_l_l_o"
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should format specific bytes in a String" do
|
35
|
-
subject.format_chars(:include => [104, 108]) { |c|
|
36
|
-
c.upcase
|
37
|
-
}.should == 'HeLLo'
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should not format specific bytes in a String" do
|
41
|
-
subject.format_chars(:exclude => [101, 111]) { |c|
|
42
|
-
c.upcase
|
43
|
-
}.should == 'HeLLo'
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should format ranges of bytes in a String" do
|
47
|
-
subject.format_chars(:include => (104..108)) { |c|
|
48
|
-
c.upcase
|
49
|
-
}.should == 'HeLLo'
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should not format ranges of bytes in a String" do
|
53
|
-
subject.format_chars(:exclude => (104..108)) { |c|
|
54
|
-
c.upcase
|
55
|
-
}.should == 'hEllO'
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should format specific chars in a String" do
|
59
|
-
subject.format_chars(:include => ['h', 'l']) { |c|
|
60
|
-
c.upcase
|
61
|
-
}.should == 'HeLLo'
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should not format specific bytes in a String" do
|
65
|
-
subject.format_chars(:exclude => ['e', 'o']) { |c|
|
66
|
-
c.upcase
|
67
|
-
}.should == 'HeLLo'
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should format ranges of chars in a String" do
|
71
|
-
subject.format_chars(:include => ('h'..'l')) { |c|
|
72
|
-
c.upcase
|
73
|
-
}.should == 'HeLLo'
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should not format ranges of chars in a String" do
|
77
|
-
subject.format_chars(:exclude => ('h'..'l')) { |c|
|
78
|
-
c.upcase
|
79
|
-
}.should == 'hEllO'
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
27
|
describe "#format_bytes" do
|
84
28
|
it "should format each byte in the String" do
|
85
29
|
subject.format_bytes { |b|
|
@@ -110,28 +54,36 @@ describe String do
|
|
110
54
|
b - 32
|
111
55
|
}.should == 'hEllO'
|
112
56
|
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#format_chars" do
|
60
|
+
it "should format each character in the String" do
|
61
|
+
subject.format_chars { |c|
|
62
|
+
"#{c}."
|
63
|
+
}.should == "h.e.l.l.o."
|
64
|
+
end
|
113
65
|
|
114
66
|
it "should format specific chars in a String" do
|
115
|
-
subject.
|
116
|
-
|
67
|
+
subject.format_chars(:include => ['h', 'l']) { |c|
|
68
|
+
c.upcase
|
117
69
|
}.should == 'HeLLo'
|
118
70
|
end
|
119
71
|
|
120
|
-
it "should not format specific
|
121
|
-
subject.
|
122
|
-
|
123
|
-
}.should == '
|
72
|
+
it "should not format specific chars in a String" do
|
73
|
+
subject.format_chars(:exclude => ['h', 'l']) { |c|
|
74
|
+
c.upcase
|
75
|
+
}.should == 'hEllO'
|
124
76
|
end
|
125
77
|
|
126
78
|
it "should format ranges of chars in a String" do
|
127
|
-
subject.
|
128
|
-
|
79
|
+
subject.format_chars(:include => /[h-l]/) { |c|
|
80
|
+
c.upcase
|
129
81
|
}.should == 'HeLLo'
|
130
82
|
end
|
131
83
|
|
132
84
|
it "should not format ranges of chars in a String" do
|
133
|
-
subject.
|
134
|
-
|
85
|
+
subject.format_chars(:exclude => /[h-l]/) { |c|
|
86
|
+
c.upcase
|
135
87
|
}.should == 'hEllO'
|
136
88
|
end
|
137
89
|
end
|
data/spec/mixin_spec.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ronin/mixin'
|
3
|
+
|
4
|
+
module Mixins
|
5
|
+
module Test1
|
6
|
+
end
|
7
|
+
|
8
|
+
module Test2
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Mixin do
|
13
|
+
subject do
|
14
|
+
Module.new do
|
15
|
+
include Mixin
|
16
|
+
|
17
|
+
mixin Mixins::Test1, Mixins::Test2
|
18
|
+
mixin { @var = 1 }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when included" do
|
23
|
+
before(:all) do
|
24
|
+
@base = Class.new
|
25
|
+
@base.send :include, subject
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should include the mixed in modules" do
|
29
|
+
@base.should include(Mixins::Test1)
|
30
|
+
@base.should include(Mixins::Test2)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should evaluate the mixin block" do
|
34
|
+
@base.instance_variable_get("@var").should == 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when extended" do
|
39
|
+
before(:all) do
|
40
|
+
@base = Object.new
|
41
|
+
@base.send :extend, subject
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should extend the mixed in modules" do
|
45
|
+
@base.should be_kind_of(Mixins::Test1)
|
46
|
+
@base.should be_kind_of(Mixins::Test2)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should evaluate the mixin block" do
|
50
|
+
@base.instance_variable_get("@var").should == 1
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -35,13 +35,6 @@ describe Network::HTTP do
|
|
35
35
|
options[:port].should == url.port
|
36
36
|
end
|
37
37
|
|
38
|
-
it "should accept nil" do
|
39
|
-
options = subject.expand_url(nil)
|
40
|
-
|
41
|
-
options[:port].should == Net::HTTP.default_port
|
42
|
-
options[:path].should == '/'
|
43
|
-
end
|
44
|
-
|
45
38
|
it "should default :path to '/'" do
|
46
39
|
options = subject.expand_url(URI('http://example.com'))
|
47
40
|
|
@@ -3,7 +3,7 @@ require 'ronin/network/http/proxy'
|
|
3
3
|
|
4
4
|
describe Network::HTTP::Proxy do
|
5
5
|
describe "parse" do
|
6
|
-
subject {
|
6
|
+
subject { described_class }
|
7
7
|
|
8
8
|
it "should parse host-names" do
|
9
9
|
proxy = subject.parse('127.0.0.1')
|
@@ -46,7 +46,7 @@ describe Network::HTTP::Proxy do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
describe "create" do
|
49
|
-
subject {
|
49
|
+
subject { described_class }
|
50
50
|
|
51
51
|
let(:host) { '127.0.0.1' }
|
52
52
|
let(:port) { 8080 }
|