ronin 0.2.2 → 0.2.3
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.
- data/History.txt +53 -0
- data/Manifest.txt +26 -18
- data/README.txt +12 -19
- data/Rakefile +9 -9
- data/TODO.txt +5 -5
- data/lib/ronin/cacheable.rb +246 -0
- data/lib/ronin/database/database.rb +21 -3
- data/lib/ronin/database/exceptions/invalid_config.rb +1 -1
- data/lib/ronin/environment.rb +5 -2
- data/lib/ronin/extensions.rb +2 -0
- data/lib/ronin/{models.rb → extensions/array.rb} +19 -6
- data/lib/ronin/extensions/ip_addr.rb +127 -0
- data/lib/ronin/{objectify/exceptions/object_context_not_found.rb → extensions/kernel.rb} +14 -3
- data/lib/ronin/extensions/uri/query_params.rb +4 -2
- data/lib/ronin/formatting/extensions/binary/integer.rb +6 -0
- data/lib/ronin/formatting/extensions/binary/string.rb +14 -12
- data/lib/ronin/formatting/extensions/text/string.rb +37 -19
- data/lib/ronin/has_license.rb +4 -2
- data/lib/ronin/model.rb +0 -1
- data/lib/ronin/network/extensions/http/net.rb +30 -3
- data/lib/ronin/network/extensions/telnet/net.rb +0 -18
- data/lib/ronin/network/http/exceptions/unknown_request.rb +1 -1
- data/lib/ronin/platform/exceptions/extension_not_found.rb +1 -1
- data/lib/ronin/platform/exceptions/overlay_cached.rb +1 -1
- data/lib/ronin/platform/exceptions/overlay_not_found.rb +1 -1
- data/lib/ronin/platform/extension.rb +18 -3
- data/lib/ronin/platform/extension_cache.rb +7 -1
- data/lib/ronin/platform/object_cache.rb +13 -12
- data/lib/ronin/platform/overlay.rb +14 -6
- data/lib/ronin/platform/overlay_cache.rb +11 -5
- data/lib/ronin/product.rb +20 -3
- data/lib/ronin/ronin.rb +0 -15
- data/lib/ronin/rpc/exceptions/response_missing.rb +1 -1
- data/lib/ronin/sessions/esmtp.rb +1 -10
- data/lib/ronin/{objectify.rb → sessions/exceptions.rb} +3 -3
- data/lib/ronin/{objectify/exceptions/unknown_object_context.rb → sessions/exceptions/variable_missing.rb} +4 -4
- data/lib/ronin/sessions/http.rb +3 -10
- data/lib/ronin/sessions/imap.rb +1 -10
- data/lib/ronin/sessions/pop3.rb +1 -9
- data/lib/ronin/sessions/session.rb +11 -21
- data/lib/ronin/sessions/smtp.rb +1 -10
- data/lib/ronin/sessions/tcp.rb +10 -13
- data/lib/ronin/sessions/telnet.rb +2 -17
- data/lib/ronin/sessions/udp.rb +6 -11
- data/lib/ronin/static/finders.rb +24 -0
- data/lib/ronin/ui/command_line/command_line.rb +41 -21
- data/lib/ronin/ui/command_line/commands/help.rb +7 -3
- data/lib/ronin/ui/command_line/commands/ls.rb +1 -1
- data/lib/ronin/ui/command_line/commands/rm.rb +1 -1
- data/lib/ronin/ui/command_line/exceptions/unknown_command.rb +1 -1
- data/lib/ronin/ui/diagnostics.rb +12 -5
- data/lib/ronin/ui/hexdump/extensions/file.rb +3 -1
- data/lib/ronin/ui/hexdump/hexdump.rb +1 -1
- data/lib/ronin/ui/verbose.rb +14 -0
- data/lib/ronin/version.rb +1 -1
- data/spec/cacheable_spec.rb +150 -0
- data/spec/classes/cacheable_model.rb +15 -0
- data/spec/classes/licensed_model.rb +12 -0
- data/spec/code/classes/thing.rb +13 -0
- data/spec/code/reference_spec.rb +1 -14
- data/spec/extensions/array_spec.rb +34 -0
- data/spec/extensions/ip_addr_spec.rb +44 -0
- data/spec/extensions/kernel_spec.rb +19 -0
- data/spec/extensions/uri/query_params_spec.rb +8 -0
- data/spec/formatting/binary/string_spec.rb +1 -1
- data/spec/formatting/digest/string_spec.rb +84 -0
- data/spec/formatting/http/string_spec.rb +84 -0
- data/spec/formatting/text/string_spec.rb +51 -0
- data/spec/has_license_spec.rb +29 -0
- data/spec/helpers/cacheable.rb +7 -0
- data/spec/helpers/contexts/ronin_cacheable_model.rb +13 -0
- data/spec/helpers/database.rb +5 -0
- data/spec/platform/helpers/overlays/hello/lib/init.rb +1 -0
- data/spec/platform/helpers/overlays/hello/lib/stuff/another_test.rb +6 -0
- data/spec/platform/helpers/overlays/hello/lib/stuff/test.rb +4 -0
- data/spec/platform/overlay_cache_spec.rb +1 -1
- data/spec/platform/overlay_spec.rb +28 -0
- data/spec/product_spec.rb +7 -0
- data/spec/sessions/classes/test_session.rb +11 -0
- data/spec/sessions/classes/uses_test_session.rb +10 -0
- data/spec/sessions/session_spec.rb +13 -44
- data/spec/spec_helper.rb +0 -5
- data/spec/static/{helpers → classes}/static_class.rb +0 -0
- data/spec/static/helpers/static.rb +0 -1
- data/spec/static/static_spec.rb +1 -0
- metadata +44 -35
- data/lib/ronin/objectify/exceptions.rb +0 -25
- data/lib/ronin/objectify/objectify.rb +0 -240
- data/lib/ronin/target.rb +0 -44
- data/lib/ronin/ui/command_line/param_parser.rb +0 -93
- data/spec/formatting/digest_spec.rb +0 -54
- data/spec/formatting/http_spec.rb +0 -53
- data/spec/formatting/text_spec.rb +0 -40
- data/spec/helpers.rb +0 -0
- data/spec/objectify/objectify_spec.rb +0 -31
- data/spec/target_spec.rb +0 -16
- data/spec/ui/command_line/helpers/example_command.rb +0 -21
- data/spec/ui/command_line/param_parser_spec.rb +0 -49
|
@@ -51,11 +51,15 @@ module Ronin
|
|
|
51
51
|
topic = args.first
|
|
52
52
|
|
|
53
53
|
if topic
|
|
54
|
-
|
|
54
|
+
begin
|
|
55
|
+
CommandLine.get_command(topic).run('--help')
|
|
56
|
+
rescue UnknownCommand
|
|
57
|
+
fail("unknown sub-command #{topic.dump}")
|
|
58
|
+
end
|
|
55
59
|
else
|
|
56
|
-
puts 'Available commands:'
|
|
60
|
+
puts 'Available sub-commands:'
|
|
57
61
|
|
|
58
|
-
CommandLine.commands.
|
|
62
|
+
CommandLine.commands.sort.each do |name|
|
|
59
63
|
puts " #{name}"
|
|
60
64
|
end
|
|
61
65
|
end
|
data/lib/ronin/ui/diagnostics.rb
CHANGED
|
@@ -32,13 +32,22 @@ module Ronin
|
|
|
32
32
|
# Prints the given _messages_ as info diagnostics.
|
|
33
33
|
#
|
|
34
34
|
def print_info(*messages)
|
|
35
|
+
STDERR.puts(*(messages.map { |mesg| "[-] #{mesg}" }))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Prints the given _messages_ as debugging diagnostics,
|
|
40
|
+
# if Ronin::UI::Verbose was enabled.
|
|
41
|
+
#
|
|
42
|
+
def print_debug(*messages)
|
|
35
43
|
if Verbose.enabled?
|
|
36
|
-
STDERR.puts(*(messages.map { |mesg| "[
|
|
44
|
+
STDERR.puts(*(messages.map { |mesg| "[+] #{mesg}" }))
|
|
37
45
|
end
|
|
38
46
|
end
|
|
39
47
|
|
|
40
48
|
#
|
|
41
|
-
# Prints the given _messages_ as warning diagnostics
|
|
49
|
+
# Prints the given _messages_ as warning diagnostics,
|
|
50
|
+
# if Ronin::UI::Verbose was enabled.
|
|
42
51
|
#
|
|
43
52
|
def print_warning(*messages)
|
|
44
53
|
if Verbose.enabled?
|
|
@@ -50,9 +59,7 @@ module Ronin
|
|
|
50
59
|
# Prints the given _messages_ as error diagnostics.
|
|
51
60
|
#
|
|
52
61
|
def print_error(*messages)
|
|
53
|
-
|
|
54
|
-
STDERR.puts(*(messages.map { |mesg| "[!] #{mesg}" }))
|
|
55
|
-
end
|
|
62
|
+
STDERR.puts(*(messages.map { |mesg| "[!] #{mesg}" }))
|
|
56
63
|
end
|
|
57
64
|
end
|
|
58
65
|
end
|
data/lib/ronin/ui/verbose.rb
CHANGED
|
@@ -24,18 +24,32 @@
|
|
|
24
24
|
module Ronin
|
|
25
25
|
module UI
|
|
26
26
|
module Verbose
|
|
27
|
+
#
|
|
28
|
+
# Enables verbose mode.
|
|
29
|
+
#
|
|
27
30
|
def Verbose.enable!
|
|
28
31
|
@@ronin_verbose = true
|
|
29
32
|
end
|
|
30
33
|
|
|
34
|
+
#
|
|
35
|
+
# Returns +true+ if verbose mode is enabled, returns +false+
|
|
36
|
+
# otherwise.
|
|
37
|
+
#
|
|
31
38
|
def Verbose.enabled?
|
|
32
39
|
(@@ronin_verbose ||= false) == true
|
|
33
40
|
end
|
|
34
41
|
|
|
42
|
+
#
|
|
43
|
+
# Disables verbose mode.
|
|
44
|
+
#
|
|
35
45
|
def Verbose.disable!
|
|
36
46
|
@@ronin_verbose = false
|
|
37
47
|
end
|
|
38
48
|
|
|
49
|
+
#
|
|
50
|
+
# Returns +true+ if verbose mode is disabled, returns +false+
|
|
51
|
+
# otherwise.
|
|
52
|
+
#
|
|
39
53
|
def Verbose.disabled?
|
|
40
54
|
(@@ronin_verbose ||= false) == false
|
|
41
55
|
end
|
data/lib/ronin/version.rb
CHANGED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
require 'ronin/cacheable'
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'classes/cacheable_model'
|
|
5
|
+
require 'helpers/cacheable'
|
|
6
|
+
|
|
7
|
+
describe Cacheable do
|
|
8
|
+
before(:all) do
|
|
9
|
+
CacheableModel.auto_migrate!
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should maintain a list of models which are cacheable" do
|
|
13
|
+
Cacheable.models.include?(CacheableModel).should == true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should be able to load arbitrary objects from a file" do
|
|
17
|
+
objs = Cacheable.load_all_from(CACHEABLE_FILE)
|
|
18
|
+
|
|
19
|
+
objs.length.should == 1
|
|
20
|
+
objs.first.content.should == 'this is a test'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should be able to cache arbitrary objects from a file" do
|
|
24
|
+
objs = Cacheable.cache_all(CACHEABLE_FILE)
|
|
25
|
+
|
|
26
|
+
objs.length.should == 1
|
|
27
|
+
objs.first.content.should == 'this is a test'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "load_from" do
|
|
31
|
+
before(:all) do
|
|
32
|
+
CacheableModel.auto_migrate!
|
|
33
|
+
|
|
34
|
+
@obj = CacheableModel.load_from(CACHEABLE_FILE)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should set the cached_path property" do
|
|
38
|
+
@obj.cached_path.should == Pathname.new(CACHEABLE_FILE)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should set the cached_timestamp property" do
|
|
42
|
+
@obj.cached_timestamp.should == File.mtime(CACHEABLE_FILE).to_i
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should prepare the object to be cached" do
|
|
46
|
+
@obj.content.should == 'this is a test'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should preserve instance variables" do
|
|
50
|
+
@obj.config.should == true
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should preserve instance methods" do
|
|
54
|
+
@obj.greeting.should == 'hello'
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "new files" do
|
|
59
|
+
before(:all) do
|
|
60
|
+
CacheableModel.auto_migrate!
|
|
61
|
+
FileUtils.cp CACHEABLE_FILE, CACHEABLE_PATH
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should be able to cache new files" do
|
|
65
|
+
obj = CacheableModel.cache(CACHEABLE_PATH)
|
|
66
|
+
|
|
67
|
+
obj.should_not be_dirty
|
|
68
|
+
obj.id.should == 1
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "should call the cache method before saving the new object" do
|
|
72
|
+
model = CacheableModel.first
|
|
73
|
+
|
|
74
|
+
model.content.should == 'this is a test'
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "unmodified files" do
|
|
79
|
+
before(:all) do
|
|
80
|
+
CacheableModel.auto_migrate!
|
|
81
|
+
CacheableModel.cache(CACHEABLE_PATH)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should not re-cache unmodified files" do
|
|
85
|
+
model = CacheableModel.first
|
|
86
|
+
|
|
87
|
+
(model.sync!).should == false
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "modified files" do
|
|
92
|
+
before(:all) do
|
|
93
|
+
CacheableModel.auto_migrate!
|
|
94
|
+
|
|
95
|
+
model = CacheableModel.cache(CACHEABLE_PATH)
|
|
96
|
+
model.cached_timestamp -= 10
|
|
97
|
+
model.save!
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "should re-cache modified files" do
|
|
101
|
+
model = CacheableModel.first
|
|
102
|
+
|
|
103
|
+
(model.sync!).should == true
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
describe "cached files" do
|
|
108
|
+
before(:all) do
|
|
109
|
+
CacheableModel.auto_migrate!
|
|
110
|
+
CacheableModel.cache(CACHEABLE_FILE)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should be able to load the original object" do
|
|
114
|
+
model = CacheableModel.first
|
|
115
|
+
|
|
116
|
+
model.load_original!
|
|
117
|
+
model.greeting.should == 'hello'
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "should load the original object on demand" do
|
|
121
|
+
model = CacheableModel.first
|
|
122
|
+
model.greeting.should == 'hello'
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should only load the original object once" do
|
|
126
|
+
model = CacheableModel.first
|
|
127
|
+
model.load_original!
|
|
128
|
+
|
|
129
|
+
model.config = false
|
|
130
|
+
model.load_original!
|
|
131
|
+
|
|
132
|
+
model.config.should == false
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "missing files" do
|
|
137
|
+
before(:all) do
|
|
138
|
+
CacheableModel.auto_migrate!
|
|
139
|
+
CacheableModel.cache(CACHEABLE_PATH)
|
|
140
|
+
|
|
141
|
+
FileUtils.rm CACHEABLE_PATH
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "should be able to expunge cached objects for missing files" do
|
|
145
|
+
CacheableModel.first.sync!
|
|
146
|
+
|
|
147
|
+
CacheableModel.all(:cached_path => CACHEABLE_PATH).should be_empty
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
data/spec/code/reference_spec.rb
CHANGED
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
require 'ronin/code/reference'
|
|
2
2
|
|
|
3
3
|
require 'spec_helper'
|
|
4
|
+
require 'code/classes/thing'
|
|
4
5
|
|
|
5
6
|
describe Code::Reference do
|
|
6
7
|
before(:all) do
|
|
7
|
-
class Thing
|
|
8
|
-
|
|
9
|
-
def exposed
|
|
10
|
-
1
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
protected
|
|
14
|
-
|
|
15
|
-
def not_exposed
|
|
16
|
-
2
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
end
|
|
20
|
-
|
|
21
8
|
@object = Thing.new
|
|
22
9
|
@ref = Code::Reference.new(@object)
|
|
23
10
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'ronin/extensions/array'
|
|
2
|
+
|
|
3
|
+
describe Array do
|
|
4
|
+
it "should provide Array#power_set" do
|
|
5
|
+
[].respond_to?(:power_set).should == true
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe "power_set" do
|
|
9
|
+
before(:all) do
|
|
10
|
+
@array = [1,2,3]
|
|
11
|
+
@set = @array.power_set
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should contain an empty set" do
|
|
15
|
+
@set.include?([]).should == true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should contain singleton sets of all the elements" do
|
|
19
|
+
@set.include?([1]).should == true
|
|
20
|
+
@set.include?([2]).should == true
|
|
21
|
+
@set.include?([3]).should == true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should include the sub-sets of the original set" do
|
|
25
|
+
@set.include?([1,2]).should == true
|
|
26
|
+
@set.include?([1,3]).should == true
|
|
27
|
+
@set.include?([2,3]).should == true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should include the original set itself" do
|
|
31
|
+
@set.include?(@array).should == true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'ronin/extensions/ip_addr'
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe IPAddr do
|
|
6
|
+
describe "CIDR addresses" do
|
|
7
|
+
before(:all) do
|
|
8
|
+
@fixed_addr = IPAddr.new('10.1.1.2')
|
|
9
|
+
@class_c = IPAddr.new('10.1.1.2/24')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should only iterate over one IP address for an address" do
|
|
13
|
+
addresses = @fixed_addr.map { |ip| IPAddr.new(ip) }
|
|
14
|
+
|
|
15
|
+
addresses.length.should == 1
|
|
16
|
+
@fixed_addr.include?(addresses.first)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should iterate over all IP addresses contained within the IP range" do
|
|
20
|
+
@class_c.each do |ip|
|
|
21
|
+
@class_c.include?(IPAddr.new(ip)).should == true
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "globbed addresses" do
|
|
27
|
+
before(:all) do
|
|
28
|
+
@ipv4_range = '10.1.1-5.1'
|
|
29
|
+
@ipv6_range = '::ff::02-0a::c3'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should iterate over all IP addresses in an IPv4 range" do
|
|
33
|
+
IPAddr.each(@ipv4_range) do |ip|
|
|
34
|
+
ip =~ /^10\.1\.[1-5]\.1$/
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should iterate over all IP addresses in an IPv6 range" do
|
|
39
|
+
IPAddr.each(@ipv6_range) do |ip|
|
|
40
|
+
ip =~ /^::ff::0[2-9a]::c3$/
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|