metasploit-model 0.28.0-java → 0.29.0-java
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/.travis.yml +3 -1
- data/config/locales/en.yml +0 -171
- data/lib/metasploit/model.rb +0 -2
- data/lib/metasploit/model/spec.rb +0 -130
- data/lib/metasploit/model/version.rb +1 -1
- data/spec/support/shared/examples/metasploit/model/search/operator/help.rb +4 -6
- data/spec/support/shared/examples/metasploit/model/translation.rb +1 -1
- data/spec/support/shared/examples/search_association.rb +1 -1
- data/spec/support/shared/examples/search_with.rb +4 -2
- metadata +2 -348
- data/app/models/metasploit/model/module/ancestor/spec/template.rb +0 -125
- data/app/models/metasploit/model/module/class/spec/template.rb +0 -92
- data/app/models/metasploit/model/module/instance/spec/template.rb +0 -97
- data/app/models/metasploit/model/spec/template.rb +0 -277
- data/app/validators/derivation_validator.rb +0 -17
- data/app/validators/dynamic_length_validator.rb +0 -45
- data/lib/metasploit/model/architecture.rb +0 -342
- data/lib/metasploit/model/author.rb +0 -54
- data/lib/metasploit/model/authority.rb +0 -141
- data/lib/metasploit/model/authority/bid.rb +0 -10
- data/lib/metasploit/model/authority/cve.rb +0 -10
- data/lib/metasploit/model/authority/msb.rb +0 -10
- data/lib/metasploit/model/authority/osvdb.rb +0 -10
- data/lib/metasploit/model/authority/pmasa.rb +0 -10
- data/lib/metasploit/model/authority/secunia.rb +0 -10
- data/lib/metasploit/model/authority/us_cert_vu.rb +0 -10
- data/lib/metasploit/model/authority/waraxe.rb +0 -31
- data/lib/metasploit/model/authority/zdi.rb +0 -10
- data/lib/metasploit/model/derivation.rb +0 -109
- data/lib/metasploit/model/derivation/full_name.rb +0 -19
- data/lib/metasploit/model/email_address.rb +0 -124
- data/lib/metasploit/model/module.rb +0 -20
- data/lib/metasploit/model/module/action.rb +0 -52
- data/lib/metasploit/model/module/ancestor.rb +0 -491
- data/lib/metasploit/model/module/ancestor/spec.rb +0 -6
- data/lib/metasploit/model/module/architecture.rb +0 -34
- data/lib/metasploit/model/module/author.rb +0 -40
- data/lib/metasploit/model/module/class.rb +0 -403
- data/lib/metasploit/model/module/class/spec.rb +0 -6
- data/lib/metasploit/model/module/handler.rb +0 -29
- data/lib/metasploit/model/module/instance.rb +0 -622
- data/lib/metasploit/model/module/instance/spec.rb +0 -6
- data/lib/metasploit/model/module/path.rb +0 -159
- data/lib/metasploit/model/module/platform.rb +0 -32
- data/lib/metasploit/model/module/rank.rb +0 -85
- data/lib/metasploit/model/module/reference.rb +0 -32
- data/lib/metasploit/model/module/stance.rb +0 -16
- data/lib/metasploit/model/module/target.rb +0 -78
- data/lib/metasploit/model/module/target/architecture.rb +0 -34
- data/lib/metasploit/model/module/target/platform.rb +0 -34
- data/lib/metasploit/model/module/type.rb +0 -38
- data/lib/metasploit/model/platform.rb +0 -246
- data/lib/metasploit/model/real_pathname.rb +0 -16
- data/lib/metasploit/model/reference.rb +0 -104
- data/spec/app/models/metasploit/model/module/ancestor/spec/template_spec.rb +0 -174
- data/spec/app/models/metasploit/model/module/class/spec/template_spec.rb +0 -222
- data/spec/app/models/metasploit/model/module/instance/spec/template_spec.rb +0 -201
- data/spec/app/models/metasploit/model/search/operator/deprecated/app_spec.rb +0 -62
- data/spec/app/models/metasploit/model/search/operator/deprecated/author_spec.rb +0 -197
- data/spec/app/models/metasploit/model/search/operator/deprecated/authority_spec.rb +0 -135
- data/spec/app/models/metasploit/model/search/operator/deprecated/platform_spec.rb +0 -124
- data/spec/app/models/metasploit/model/search/operator/deprecated/ref_spec.rb +0 -387
- data/spec/app/models/metasploit/model/search/operator/deprecated/text_spec.rb +0 -399
- data/spec/app/models/metasploit/model/spec/template_spec.rb +0 -23
- data/spec/app/validators/derivation_validator_spec.rb +0 -92
- data/spec/app/validators/dynamic_length_validator_spec.rb +0 -293
- data/spec/dummy/app/models/dummy/architecture.rb +0 -92
- data/spec/dummy/app/models/dummy/author.rb +0 -15
- data/spec/dummy/app/models/dummy/authority.rb +0 -130
- data/spec/dummy/app/models/dummy/email_address.rb +0 -27
- data/spec/dummy/app/models/dummy/module/action.rb +0 -25
- data/spec/dummy/app/models/dummy/module/ancestor.rb +0 -67
- data/spec/dummy/app/models/dummy/module/architecture.rb +0 -19
- data/spec/dummy/app/models/dummy/module/author.rb +0 -28
- data/spec/dummy/app/models/dummy/module/class.rb +0 -69
- data/spec/dummy/app/models/dummy/module/instance.rb +0 -209
- data/spec/dummy/app/models/dummy/module/path.rb +0 -64
- data/spec/dummy/app/models/dummy/module/platform.rb +0 -19
- data/spec/dummy/app/models/dummy/module/rank.rb +0 -44
- data/spec/dummy/app/models/dummy/module/reference.rb +0 -19
- data/spec/dummy/app/models/dummy/module/target.rb +0 -62
- data/spec/dummy/app/models/dummy/module/target/architecture.rb +0 -19
- data/spec/dummy/app/models/dummy/module/target/platform.rb +0 -19
- data/spec/dummy/app/models/dummy/platform.rb +0 -58
- data/spec/dummy/app/models/dummy/reference.rb +0 -31
- data/spec/dummy/spec/factories/dummy/architectures.rb +0 -13
- data/spec/dummy/spec/factories/dummy/authorities.rb +0 -32
- data/spec/dummy/spec/factories/dummy/authors.rb +0 -8
- data/spec/dummy/spec/factories/dummy/email_addresses.rb +0 -8
- data/spec/dummy/spec/factories/dummy/module/actions.rb +0 -13
- data/spec/dummy/spec/factories/dummy/module/ancestors.rb +0 -45
- data/spec/dummy/spec/factories/dummy/module/architectures.rb +0 -35
- data/spec/dummy/spec/factories/dummy/module/authors.rb +0 -10
- data/spec/dummy/spec/factories/dummy/module/classes.rb +0 -40
- data/spec/dummy/spec/factories/dummy/module/instances.rb +0 -86
- data/spec/dummy/spec/factories/dummy/module/paths.rb +0 -16
- data/spec/dummy/spec/factories/dummy/module/platforms.rb +0 -35
- data/spec/dummy/spec/factories/dummy/module/ranks.rb +0 -14
- data/spec/dummy/spec/factories/dummy/module/references.rb +0 -17
- data/spec/dummy/spec/factories/dummy/module/target/architectures.rb +0 -40
- data/spec/dummy/spec/factories/dummy/module/target/platforms.rb +0 -41
- data/spec/dummy/spec/factories/dummy/module/targets.rb +0 -46
- data/spec/dummy/spec/factories/dummy/platforms.rb +0 -3
- data/spec/dummy/spec/factories/dummy/references.rb +0 -26
- data/spec/factories/metasploit/model/architectures.rb +0 -6
- data/spec/factories/metasploit/model/authorities.rb +0 -28
- data/spec/factories/metasploit/model/authors.rb +0 -9
- data/spec/factories/metasploit/model/email_addresses.rb +0 -14
- data/spec/factories/metasploit/model/module/actions.rb +0 -9
- data/spec/factories/metasploit/model/module/ancestors.rb +0 -180
- data/spec/factories/metasploit/model/module/architectures.rb +0 -15
- data/spec/factories/metasploit/model/module/classes.rb +0 -47
- data/spec/factories/metasploit/model/module/handlers.rb +0 -3
- data/spec/factories/metasploit/model/module/instances.rb +0 -83
- data/spec/factories/metasploit/model/module/paths.rb +0 -51
- data/spec/factories/metasploit/model/module/platforms.rb +0 -15
- data/spec/factories/metasploit/model/module/ranks.rb +0 -9
- data/spec/factories/metasploit/model/module/references.rb +0 -11
- data/spec/factories/metasploit/model/module/stances.rb +0 -3
- data/spec/factories/metasploit/model/module/targets.rb +0 -22
- data/spec/factories/metasploit/model/module/types.rb +0 -5
- data/spec/factories/metasploit/model/references.rb +0 -88
- data/spec/lib/metasploit/model/architecture_spec.rb +0 -52
- data/spec/lib/metasploit/model/author_spec.rb +0 -6
- data/spec/lib/metasploit/model/authority/bid_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/cve_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/msb_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/osvdb_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/pmasa_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/secunia_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/us_cert_vu_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/waraxe_spec.rb +0 -51
- data/spec/lib/metasploit/model/authority/zdi_spec.rb +0 -21
- data/spec/lib/metasploit/model/authority_spec.rb +0 -10
- data/spec/lib/metasploit/model/derivation/full_name_spec.rb +0 -75
- data/spec/lib/metasploit/model/derivation_spec.rb +0 -217
- data/spec/lib/metasploit/model/email_address_spec.rb +0 -19
- data/spec/lib/metasploit/model/module/action_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/ancestor_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/architecture_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/author_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/class_spec.rb +0 -19
- data/spec/lib/metasploit/model/module/handler_spec.rb +0 -61
- data/spec/lib/metasploit/model/module/instance_spec.rb +0 -183
- data/spec/lib/metasploit/model/module/path_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/platform_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/rank_spec.rb +0 -29
- data/spec/lib/metasploit/model/module/reference_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/stance_spec.rb +0 -30
- data/spec/lib/metasploit/model/module/target/architecture_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/target/platform_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/target_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/type_spec.rb +0 -125
- data/spec/lib/metasploit/model/platform_spec.rb +0 -100
- data/spec/lib/metasploit/model/reference_spec.rb +0 -21
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/contents/metasploit_module.rb +0 -12
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents.rb +0 -10
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents/metasploit_module.rb +0 -15
- data/spec/support/shared/examples/derives.rb +0 -115
- data/spec/support/shared/examples/metasploit/model/architecture.rb +0 -425
- data/spec/support/shared/examples/metasploit/model/architecture/seed.rb +0 -25
- data/spec/support/shared/examples/metasploit/model/author.rb +0 -27
- data/spec/support/shared/examples/metasploit/model/authority.rb +0 -124
- data/spec/support/shared/examples/metasploit/model/authority/seed.rb +0 -49
- data/spec/support/shared/examples/metasploit/model/email_address.rb +0 -220
- data/spec/support/shared/examples/metasploit/model/module/action.rb +0 -26
- data/spec/support/shared/examples/metasploit/model/module/ancestor.rb +0 -2004
- data/spec/support/shared/examples/metasploit/model/module/ancestor/payload_factory.rb +0 -63
- data/spec/support/shared/examples/metasploit/model/module/architecture.rb +0 -36
- data/spec/support/shared/examples/metasploit/model/module/author.rb +0 -29
- data/spec/support/shared/examples/metasploit/model/module/class.rb +0 -1514
- data/spec/support/shared/examples/metasploit/model/module/handler.rb +0 -21
- data/spec/support/shared/examples/metasploit/model/module/instance.rb +0 -1384
- data/spec/support/shared/examples/metasploit/model/module/instance/class_methods.rb +0 -537
- data/spec/support/shared/examples/metasploit/model/module/instance/is_not_stanced_with_module_type.rb +0 -22
- data/spec/support/shared/examples/metasploit/model/module/instance/is_stanced_with_module_type.rb +0 -38
- data/spec/support/shared/examples/metasploit/model/module/instance/validates/dynamic_length_of.rb +0 -131
- data/spec/support/shared/examples/metasploit/model/module/path.rb +0 -493
- data/spec/support/shared/examples/metasploit/model/module/platform.rb +0 -36
- data/spec/support/shared/examples/metasploit/model/module/rank.rb +0 -92
- data/spec/support/shared/examples/metasploit/model/module/reference.rb +0 -16
- data/spec/support/shared/examples/metasploit/model/module/target.rb +0 -29
- data/spec/support/shared/examples/metasploit/model/module/target/architecture.rb +0 -56
- data/spec/support/shared/examples/metasploit/model/module/target/platform.rb +0 -56
- data/spec/support/shared/examples/metasploit/model/platform.rb +0 -213
- data/spec/support/shared/examples/metasploit/model/real_pathname.rb +0 -29
- data/spec/support/shared/examples/metasploit/model/reference.rb +0 -410
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/app.rb +0 -44
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/authority.rb +0 -72
- data/spec/support/templates/metasploit/model/module/ancestors/_attributes.rb.erb +0 -9
- data/spec/support/templates/metasploit/model/module/ancestors/_methods.rb.erb +0 -8
- data/spec/support/templates/metasploit/model/module/ancestors/_validations.rb.erb +0 -6
- data/spec/support/templates/metasploit/model/module/ancestors/base.rb.erb +0 -3
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_auxiliary.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_encoder.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_exploit.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_non_payload.rb.erb +0 -5
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_nop.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_payload.rb.erb +0 -4
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_post.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_handled.rb.erb +0 -20
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_single.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stage.rb.erb +0 -0
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stager.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/classes/_methods.rb.erb +0 -9
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'Metasploit::Model::Module::Ancestor payload factory' do |options={}|
|
|
2
|
-
options.assert_valid_keys(:handler_type)
|
|
3
|
-
|
|
4
|
-
should_have_handler_type = options[:handler_type]
|
|
5
|
-
|
|
6
|
-
its(:module_type) { should == 'payload' }
|
|
7
|
-
|
|
8
|
-
context 'contents' do
|
|
9
|
-
include_context 'Metasploit::Model::Module::Ancestor factory contents'
|
|
10
|
-
|
|
11
|
-
context 'metasploit_module' do
|
|
12
|
-
include_context 'Metasploit::Model::Module::Ancestor factory contents metasploit_module'
|
|
13
|
-
|
|
14
|
-
it { should be_a Module }
|
|
15
|
-
it { should_not be_a Class }
|
|
16
|
-
|
|
17
|
-
# nil means unknown/indeterminate. true or false cause specific testing
|
|
18
|
-
unless should_have_handler_type.nil?
|
|
19
|
-
if should_have_handler_type
|
|
20
|
-
method = :should
|
|
21
|
-
else
|
|
22
|
-
method = :should_not
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it { send(method, respond_to(:handler_type_alias)) }
|
|
26
|
-
|
|
27
|
-
if should_have_handler_type
|
|
28
|
-
let(:handler_module) do
|
|
29
|
-
metasploit_module.handler_module
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
context 'handler_module' do
|
|
33
|
-
subject do
|
|
34
|
-
handler_module
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it_should_behave_like 'Metasploit::Model::Module::Handler'
|
|
38
|
-
|
|
39
|
-
context 'handler_type' do
|
|
40
|
-
subject(:handler_type) do
|
|
41
|
-
handler_module.handler_type
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it 'is different than Metasploit::Model::Module::Ancestor#handler_type' do
|
|
45
|
-
expect(handler_type).not_to eq(module_ancestor.handler_type)
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
context 'handler_type_alias' do
|
|
51
|
-
subject(:handler_type_alias) do
|
|
52
|
-
metasploit_module.handler_type_alias
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it 'should be #handler_type' do
|
|
56
|
-
handler_type_alias.should == module_ancestor.handler_type
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
Metasploit::Model::Spec.shared_examples_for 'Module::Architecture' do
|
|
2
|
-
context 'factories' do
|
|
3
|
-
context module_architecture_factory.to_s do
|
|
4
|
-
subject(module_architecture_factory) do
|
|
5
|
-
FactoryGirl.build(module_architecture_factory)
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
it { should be_valid }
|
|
9
|
-
|
|
10
|
-
context '#module_instance' do
|
|
11
|
-
subject(:module_instance) do
|
|
12
|
-
send(module_architecture_factory).module_instance
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it { should be_valid }
|
|
16
|
-
|
|
17
|
-
context '#module_architectures' do
|
|
18
|
-
subject(:module_architectures) do
|
|
19
|
-
module_instance.module_architectures
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
its(:length) { should == 1 }
|
|
23
|
-
|
|
24
|
-
it "should include #{module_architecture_factory}" do
|
|
25
|
-
expect(module_architectures).to include send(module_architecture_factory)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
context 'validations' do
|
|
33
|
-
it { should validate_presence_of :architecture }
|
|
34
|
-
it { should validate_presence_of :module_instance }
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
Metasploit::Model::Spec.shared_examples_for 'Module::Author' do
|
|
2
|
-
full_module_author_factory = "full_#{module_author_factory}"
|
|
3
|
-
|
|
4
|
-
context 'factories' do
|
|
5
|
-
context module_author_factory do
|
|
6
|
-
subject(module_author_factory) do
|
|
7
|
-
FactoryGirl.build(module_author_factory)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
it { should be_valid }
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
context full_module_author_factory do
|
|
14
|
-
subject(full_module_author_factory) do
|
|
15
|
-
FactoryGirl.build(full_module_author_factory)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it { should be_valid }
|
|
19
|
-
|
|
20
|
-
its(:email_address) { should_not be_nil }
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
context 'validations' do
|
|
25
|
-
it { should validate_presence_of(:author) }
|
|
26
|
-
it { should validate_presence_of(:module_instance) }
|
|
27
|
-
it { should_not validate_presence_of(:email_address) }
|
|
28
|
-
end
|
|
29
|
-
end
|
|
@@ -1,1514 +0,0 @@
|
|
|
1
|
-
Metasploit::Model::Spec.shared_examples_for 'Module::Class' do
|
|
2
|
-
#
|
|
3
|
-
# Module::Ancestor factories
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
module_ancestor_factory = "#{factory_namespace}_module_ancestor"
|
|
7
|
-
payload_module_ancestor_factory = "payload_#{module_ancestor_factory}"
|
|
8
|
-
non_payload_module_ancestor_factory = "non_#{payload_module_ancestor_factory}"
|
|
9
|
-
single_payload_module_ancestor_factory = "single_#{payload_module_ancestor_factory}"
|
|
10
|
-
stage_payload_module_ancestor_factory = "stage_#{payload_module_ancestor_factory}"
|
|
11
|
-
stager_payload_module_ancestor_factory = "stager_#{payload_module_ancestor_factory}"
|
|
12
|
-
|
|
13
|
-
#
|
|
14
|
-
# Module::Class factories
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
module_class_factory = "#{factory_namespace}_module_class"
|
|
18
|
-
|
|
19
|
-
context 'CONSTANTS' do
|
|
20
|
-
context 'PAYLOAD_TYPES' do
|
|
21
|
-
subject(:payload_types) do
|
|
22
|
-
described_class::PAYLOAD_TYPES
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it { should include('single') }
|
|
26
|
-
it { should include('staged') }
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
context 'STAGED_ANCESTOR_PAYLOAD_TYPES' do
|
|
30
|
-
subject(:staged_ancestor_payload_types) do
|
|
31
|
-
described_class::STAGED_ANCESTOR_PAYLOAD_TYPES
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it { should include('stage') }
|
|
35
|
-
it { should include('stager') }
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
context 'derivations' do
|
|
40
|
-
context 'with module_type derived' do
|
|
41
|
-
before(:each) do
|
|
42
|
-
module_class.module_type = module_class.derived_module_type
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
context 'with payload_type derived' do
|
|
46
|
-
before(:each) do
|
|
47
|
-
module_class.payload_type = module_class.derived_payload_type
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
context 'with payload module_type' do
|
|
51
|
-
subject(:module_class) do
|
|
52
|
-
FactoryGirl.build(
|
|
53
|
-
module_class_factory,
|
|
54
|
-
:module_type => 'payload'
|
|
55
|
-
)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it_should_behave_like 'derives', :payload_type, :validates => true
|
|
59
|
-
it_should_behave_like 'derives', :reference_name, :validates => true
|
|
60
|
-
|
|
61
|
-
context 'with payload_type derived' do
|
|
62
|
-
before(:each) do
|
|
63
|
-
module_class.payload_type = module_class.derived_payload_type
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
context 'with reference_name derived' do
|
|
67
|
-
before(:each) do
|
|
68
|
-
module_class.reference_name = module_class.derived_reference_name
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it_should_behave_like 'derives', :full_name, :validates => true
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
context 'without payload module_type' do
|
|
78
|
-
subject(:module_class) do
|
|
79
|
-
FactoryGirl.build(
|
|
80
|
-
module_class_factory,
|
|
81
|
-
:module_type => module_type
|
|
82
|
-
)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
let(:module_type) do
|
|
86
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it_should_behave_like 'derives', :reference_name, :validates => true
|
|
90
|
-
|
|
91
|
-
context 'with reference_name derived' do
|
|
92
|
-
before(:each) do
|
|
93
|
-
module_class.reference_name = module_class.derived_reference_name
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it_should_behave_like 'derives', :full_name, :validates => true
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it_should_behave_like 'derives', :module_type, :validates => true
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
context 'search' do
|
|
105
|
-
context 'attributes' do
|
|
106
|
-
it_should_behave_like 'search_attribute', :full_name, :type => :string
|
|
107
|
-
it_should_behave_like 'search_attribute', :module_type, :type => :string
|
|
108
|
-
it_should_behave_like 'search_attribute', :payload_type, :type => :string
|
|
109
|
-
it_should_behave_like 'search_attribute', :reference_name, :type => :string
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
context 'factories' do
|
|
114
|
-
context module_class_factory do
|
|
115
|
-
subject(module_class_factory) do
|
|
116
|
-
FactoryGirl.build(module_class_factory)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it { should be_valid }
|
|
120
|
-
|
|
121
|
-
context '#ancestors' do
|
|
122
|
-
subject(:ancestors) do
|
|
123
|
-
send(module_class_factory).ancestors
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
context 'Metasploit::Model::Module::Ancestor#contents list' do
|
|
127
|
-
subject(:contents_list) do
|
|
128
|
-
ancestors.map(&:contents)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
before(:each) do
|
|
132
|
-
# need to validate so that real_path is derived so contents can be read
|
|
133
|
-
ancestors.each(&:valid?)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
context 'metasploit_modules' do
|
|
137
|
-
include_context 'Metasploit::Model::Module::Ancestor#contents metasploit_module'
|
|
138
|
-
|
|
139
|
-
subject(:metasploit_modules) do
|
|
140
|
-
namespace_modules.collect { |namespace_module|
|
|
141
|
-
namespace_module_metasploit_module(namespace_module)
|
|
142
|
-
}
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
let(:namespace_modules) do
|
|
146
|
-
ancestors.collect {
|
|
147
|
-
Module.new
|
|
148
|
-
}
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
before(:each) do
|
|
152
|
-
namespace_modules.zip(contents_list) do |namespace_module, contents|
|
|
153
|
-
namespace_module.module_eval(contents)
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
context 'rank_names' do
|
|
158
|
-
subject(:rank_names) do
|
|
159
|
-
metasploit_modules.collect { |metasploit_module|
|
|
160
|
-
metasploit_module.rank_name
|
|
161
|
-
}
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
it 'should match Metasploit::Model::Module::Class#rank Metasploit::Model:Module::Rank#name' do
|
|
165
|
-
rank_names.all? { |rank_name|
|
|
166
|
-
rank_name == send(module_class_factory).rank.name
|
|
167
|
-
}.should be_true
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
context 'rank_numbers' do
|
|
172
|
-
subject(:rank_numbers) do
|
|
173
|
-
metasploit_modules.collect { |metasploit_module|
|
|
174
|
-
metasploit_module.rank_number
|
|
175
|
-
}
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it 'should match Metasploit::Model::Module::Class#rank Metasploit::Module::Module::Rank#number' do
|
|
179
|
-
rank_numbers.all? { |rank_number|
|
|
180
|
-
rank_number == send(module_class_factory).rank.number
|
|
181
|
-
}.should be_true
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
context 'module_type' do
|
|
189
|
-
subject(module_class_factory) do
|
|
190
|
-
FactoryGirl.build(
|
|
191
|
-
module_class_factory,
|
|
192
|
-
:module_type => module_type
|
|
193
|
-
)
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
context 'with payload' do
|
|
197
|
-
let(:module_type) do
|
|
198
|
-
'payload'
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
it { should be_valid }
|
|
202
|
-
|
|
203
|
-
context 'with payload_type' do
|
|
204
|
-
subject(module_class_factory) do
|
|
205
|
-
FactoryGirl.build(
|
|
206
|
-
module_class_factory,
|
|
207
|
-
:module_type => module_type,
|
|
208
|
-
:payload_type => payload_type
|
|
209
|
-
)
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
context 'single' do
|
|
213
|
-
let(:payload_type) do
|
|
214
|
-
'single'
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
it { should be_valid }
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
context 'staged' do
|
|
221
|
-
let(:payload_type) do
|
|
222
|
-
'staged'
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
it { should be_valid }
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
context 'other' do
|
|
229
|
-
let(:payload_type) do
|
|
230
|
-
'not_a_payload_type'
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
it 'should raise ArgumentError' do
|
|
234
|
-
expect {
|
|
235
|
-
send(module_class_factory)
|
|
236
|
-
}.to raise_error(ArgumentError)
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
context 'without payload' do
|
|
243
|
-
let(:module_type) do
|
|
244
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
it { should be_valid }
|
|
248
|
-
|
|
249
|
-
its(:derived_module_type) { should == module_type }
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
context 'ancestors' do
|
|
254
|
-
subject(module_class_factory) do
|
|
255
|
-
FactoryGirl.build(
|
|
256
|
-
module_class_factory,
|
|
257
|
-
:ancestors => ancestors
|
|
258
|
-
)
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
context 'single payload' do
|
|
262
|
-
let!(:ancestors) do
|
|
263
|
-
[
|
|
264
|
-
FactoryGirl.create(single_payload_module_ancestor_factory)
|
|
265
|
-
]
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
it { should be_valid }
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
context 'stage payload and stager payload' do
|
|
272
|
-
let!(:ancestors) do
|
|
273
|
-
[
|
|
274
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory),
|
|
275
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory)
|
|
276
|
-
]
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
it { should be_valid }
|
|
280
|
-
end
|
|
281
|
-
end
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
context 'validations' do
|
|
286
|
-
context 'ancestors' do
|
|
287
|
-
context 'count' do
|
|
288
|
-
subject(:module_class) do
|
|
289
|
-
FactoryGirl.build(
|
|
290
|
-
module_class_factory,
|
|
291
|
-
:ancestors => ancestors,
|
|
292
|
-
:module_type => module_type,
|
|
293
|
-
:payload_type => payload_type
|
|
294
|
-
)
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
before(:each) do
|
|
298
|
-
# set explicitly so derivation doesn't cause other code path to run
|
|
299
|
-
module_class.module_type = module_type
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
context 'with payload module_type' do
|
|
303
|
-
let(:module_type) do
|
|
304
|
-
'payload'
|
|
305
|
-
end
|
|
306
|
-
|
|
307
|
-
before(:each) do
|
|
308
|
-
# set explicitly so derivation doesn't cause other code path to run
|
|
309
|
-
module_class.payload_type = payload_type
|
|
310
|
-
|
|
311
|
-
module_class.valid?
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
context 'with single payload_type' do
|
|
315
|
-
let(:error) do
|
|
316
|
-
'must have exactly one ancestor for single payload module class'
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
let(:payload_type) do
|
|
320
|
-
'single'
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
context 'with 1 ancestor' do
|
|
325
|
-
let(:ancestors) do
|
|
326
|
-
[
|
|
327
|
-
FactoryGirl.create(single_payload_module_ancestor_factory)
|
|
328
|
-
]
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
it 'should not record error on ancestors' do
|
|
332
|
-
module_class.errors[:ancestors].should_not include(error)
|
|
333
|
-
end
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
context 'without 1 ancestor' do
|
|
337
|
-
let(:ancestors) do
|
|
338
|
-
[]
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
it 'should record error on ancestors' do
|
|
342
|
-
module_class.errors[:ancestors].should include(error)
|
|
343
|
-
end
|
|
344
|
-
end
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
context 'with staged payload_type' do
|
|
348
|
-
let(:error) do
|
|
349
|
-
'must have exactly two ancestors (stager + stage) for staged payload module class'
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
let(:payload_type) do
|
|
353
|
-
'staged'
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
context 'with 2 ancestors' do
|
|
357
|
-
let(:ancestors) do
|
|
358
|
-
[
|
|
359
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory),
|
|
360
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory)
|
|
361
|
-
]
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
it 'should not record error on ancestors' do
|
|
365
|
-
module_class.errors[:ancestors].should_not include(error)
|
|
366
|
-
end
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
context 'without 2 ancestors' do
|
|
370
|
-
let(:ancestors) do
|
|
371
|
-
[
|
|
372
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory)
|
|
373
|
-
]
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
it 'should record error on ancestors' do
|
|
377
|
-
module_class.errors[:ancestors].should include(error)
|
|
378
|
-
end
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
context 'without payload module_type' do
|
|
384
|
-
let(:error) do
|
|
385
|
-
'must have exactly one ancestor as a non-payload module class'
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
let(:module_type) do
|
|
389
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
390
|
-
end
|
|
391
|
-
|
|
392
|
-
let(:payload_type) do
|
|
393
|
-
nil
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
before(:each) do
|
|
397
|
-
module_class.valid?
|
|
398
|
-
end
|
|
399
|
-
|
|
400
|
-
context 'with 1 ancestor' do
|
|
401
|
-
let(:ancestors) do
|
|
402
|
-
[
|
|
403
|
-
FactoryGirl.create(non_payload_module_ancestor_factory)
|
|
404
|
-
]
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
it 'should not record error on ancestors' do
|
|
408
|
-
module_class.errors[:ancestors].should_not include(error)
|
|
409
|
-
end
|
|
410
|
-
end
|
|
411
|
-
|
|
412
|
-
context 'without 1 ancestor' do
|
|
413
|
-
let(:ancestors) do
|
|
414
|
-
module_class.errors[:ancestors].should include(error)
|
|
415
|
-
end
|
|
416
|
-
end
|
|
417
|
-
end
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
context 'module_types' do
|
|
421
|
-
context 'between Metasploit::Model::Module::Ancestor#module_type and Metasploit::Model::Module::Class#module_type' do
|
|
422
|
-
subject(:module_class) do
|
|
423
|
-
FactoryGirl.build(
|
|
424
|
-
module_class_factory,
|
|
425
|
-
:module_type => module_type,
|
|
426
|
-
:ancestors => ancestors
|
|
427
|
-
)
|
|
428
|
-
end
|
|
429
|
-
|
|
430
|
-
def error(module_class, ancestor)
|
|
431
|
-
"can contain ancestors only with same module_type (#{module_class.module_type}); " \
|
|
432
|
-
"#{ancestor.full_name} cannot be an ancestor due to its module_type (#{ancestor.module_type})"
|
|
433
|
-
end
|
|
434
|
-
|
|
435
|
-
before(:each) do
|
|
436
|
-
# Explicitly set module_type so its not derived, which could cause an alternate code path to be tested
|
|
437
|
-
module_class.module_type = module_type
|
|
438
|
-
|
|
439
|
-
module_class.valid?
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
context 'with module_type' do
|
|
443
|
-
let(:module_type) do
|
|
444
|
-
FactoryGirl.generate :metasploit_model_module_type
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
context 'with same Metasploit::Model::Module::Ancestor#module_type and Metasploit::Model::Module::Class#module_type' do
|
|
448
|
-
let(:ancestors) do
|
|
449
|
-
[
|
|
450
|
-
FactoryGirl.create(
|
|
451
|
-
module_ancestor_factory,
|
|
452
|
-
:module_type => module_type
|
|
453
|
-
)
|
|
454
|
-
]
|
|
455
|
-
end
|
|
456
|
-
|
|
457
|
-
it 'should not record on ancestors' do
|
|
458
|
-
module_class.errors[:ancestors].should_not include(error(module_class, ancestors.first))
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
context 'without same Metasploit::Model::Module::Ancestor#module_type and Metasploit::Model::Module::Class#module_type' do
|
|
463
|
-
let(:ancestors) do
|
|
464
|
-
[
|
|
465
|
-
FactoryGirl.create(
|
|
466
|
-
module_ancestor_factory,
|
|
467
|
-
:module_type => 'exploit'
|
|
468
|
-
)
|
|
469
|
-
]
|
|
470
|
-
end
|
|
471
|
-
|
|
472
|
-
let(:module_type) do
|
|
473
|
-
'nop'
|
|
474
|
-
end
|
|
475
|
-
|
|
476
|
-
it 'should record error on ancestors' do
|
|
477
|
-
module_class.errors[:ancestors].should include(error(module_class, ancestors.first))
|
|
478
|
-
end
|
|
479
|
-
end
|
|
480
|
-
end
|
|
481
|
-
|
|
482
|
-
context 'without module_type' do
|
|
483
|
-
# with a nil module_type, module_type will be derived from
|
|
484
|
-
let(:ancestors) do
|
|
485
|
-
[
|
|
486
|
-
FactoryGirl.create(module_ancestor_factory),
|
|
487
|
-
FactoryGirl.create(module_ancestor_factory)
|
|
488
|
-
]
|
|
489
|
-
end
|
|
490
|
-
|
|
491
|
-
let(:module_type) do
|
|
492
|
-
nil
|
|
493
|
-
end
|
|
494
|
-
|
|
495
|
-
it 'should not record errors on ancestors' do
|
|
496
|
-
ancestor_errors = module_class.errors[:ancestors]
|
|
497
|
-
|
|
498
|
-
ancestors.each do |ancestor|
|
|
499
|
-
ancestor_error = error(module_class, ancestor)
|
|
500
|
-
|
|
501
|
-
ancestor_errors.should_not include(ancestor_error)
|
|
502
|
-
end
|
|
503
|
-
end
|
|
504
|
-
end
|
|
505
|
-
end
|
|
506
|
-
|
|
507
|
-
context 'between Metasploit::Model::Module::Ancestor#module_types' do
|
|
508
|
-
subject(:module_class) do
|
|
509
|
-
FactoryGirl.build(
|
|
510
|
-
module_class_factory,
|
|
511
|
-
:ancestors => ancestors
|
|
512
|
-
)
|
|
513
|
-
end
|
|
514
|
-
|
|
515
|
-
let(:error) do
|
|
516
|
-
"can only contain ancestors with one module_type, " \
|
|
517
|
-
"but contains multiple module_types (#{module_type_set.sort.to_sentence})"
|
|
518
|
-
end
|
|
519
|
-
|
|
520
|
-
before(:each) do
|
|
521
|
-
module_class.valid?
|
|
522
|
-
end
|
|
523
|
-
|
|
524
|
-
context 'with same Metasploit::Model::Module::Ancestor#module_type' do
|
|
525
|
-
let(:ancestors) do
|
|
526
|
-
[
|
|
527
|
-
FactoryGirl.create(
|
|
528
|
-
module_ancestor_factory,
|
|
529
|
-
:module_type => module_type
|
|
530
|
-
),
|
|
531
|
-
FactoryGirl.create(
|
|
532
|
-
module_ancestor_factory,
|
|
533
|
-
:module_type => module_type
|
|
534
|
-
)
|
|
535
|
-
]
|
|
536
|
-
end
|
|
537
|
-
|
|
538
|
-
let(:module_type) do
|
|
539
|
-
FactoryGirl.generate :metasploit_model_module_type
|
|
540
|
-
end
|
|
541
|
-
|
|
542
|
-
let(:module_type_set) do
|
|
543
|
-
Set.new [module_type]
|
|
544
|
-
end
|
|
545
|
-
|
|
546
|
-
it 'should not record error on ancestors' do
|
|
547
|
-
module_class.errors[:ancestors].should_not include(error)
|
|
548
|
-
end
|
|
549
|
-
end
|
|
550
|
-
|
|
551
|
-
context 'without same Metasploit::Model::Module::Ancestor#module_type' do
|
|
552
|
-
let(:ancestors) do
|
|
553
|
-
module_type_set.collect { |module_type|
|
|
554
|
-
FactoryGirl.create(
|
|
555
|
-
module_ancestor_factory,
|
|
556
|
-
:module_type => module_type
|
|
557
|
-
)
|
|
558
|
-
}
|
|
559
|
-
end
|
|
560
|
-
|
|
561
|
-
let(:module_types) do
|
|
562
|
-
[
|
|
563
|
-
FactoryGirl.generate(:metasploit_model_module_type),
|
|
564
|
-
FactoryGirl.generate(:metasploit_model_module_type)
|
|
565
|
-
]
|
|
566
|
-
end
|
|
567
|
-
|
|
568
|
-
let(:module_type_set) do
|
|
569
|
-
Set.new module_types
|
|
570
|
-
end
|
|
571
|
-
|
|
572
|
-
it 'should record error on ancestors' do
|
|
573
|
-
module_class.errors[:ancestors].should include(error)
|
|
574
|
-
end
|
|
575
|
-
end
|
|
576
|
-
end
|
|
577
|
-
end
|
|
578
|
-
|
|
579
|
-
context 'payload_types' do
|
|
580
|
-
subject(:module_class) do
|
|
581
|
-
FactoryGirl.build(
|
|
582
|
-
module_class_factory,
|
|
583
|
-
:ancestors => ancestors,
|
|
584
|
-
:module_type => module_type
|
|
585
|
-
)
|
|
586
|
-
end
|
|
587
|
-
|
|
588
|
-
before(:each) do
|
|
589
|
-
# explicitly set module_type so it is not derived from ancestors
|
|
590
|
-
module_class.module_type = module_type
|
|
591
|
-
end
|
|
592
|
-
|
|
593
|
-
context "with 'payload' Metasploit::Model::Module::Class#module_type" do
|
|
594
|
-
let(:module_type) do
|
|
595
|
-
'payload'
|
|
596
|
-
end
|
|
597
|
-
|
|
598
|
-
let(:ancestors) do
|
|
599
|
-
[
|
|
600
|
-
ancestor
|
|
601
|
-
]
|
|
602
|
-
end
|
|
603
|
-
|
|
604
|
-
context 'with Metasploit::Model::Module::Class#payload_type' do
|
|
605
|
-
before(:each) do
|
|
606
|
-
# Explicitly set payload_type so it is not derived from ancestors
|
|
607
|
-
module_class.payload_type = payload_type
|
|
608
|
-
|
|
609
|
-
module_class.valid?
|
|
610
|
-
end
|
|
611
|
-
|
|
612
|
-
context 'single' do
|
|
613
|
-
let(:error) do
|
|
614
|
-
"cannot have an ancestor (#{ancestor.full_name}) " \
|
|
615
|
-
"with payload_type (#{ancestor.payload_type}) " \
|
|
616
|
-
"for class payload_type (#{payload_type})"
|
|
617
|
-
end
|
|
618
|
-
|
|
619
|
-
let(:payload_type) do
|
|
620
|
-
'single'
|
|
621
|
-
end
|
|
622
|
-
|
|
623
|
-
context "with 'single' Metasploit::Model::Module::Ancestor#payload_type" do
|
|
624
|
-
let(:ancestor) do
|
|
625
|
-
FactoryGirl.create(single_payload_module_ancestor_factory)
|
|
626
|
-
end
|
|
627
|
-
|
|
628
|
-
it 'should not record error on ancestors' do
|
|
629
|
-
module_class.errors[:ancestors].should_not include(error)
|
|
630
|
-
end
|
|
631
|
-
end
|
|
632
|
-
|
|
633
|
-
context "without 'single' Metasploit::Model::Module::Ancestor#payload_type" do
|
|
634
|
-
let(:ancestor) do
|
|
635
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory)
|
|
636
|
-
end
|
|
637
|
-
|
|
638
|
-
it 'should record error on ancestors' do
|
|
639
|
-
module_class.errors[:ancestors].should include(error)
|
|
640
|
-
end
|
|
641
|
-
end
|
|
642
|
-
end
|
|
643
|
-
|
|
644
|
-
context 'staged' do
|
|
645
|
-
let(:payload_type) do
|
|
646
|
-
'staged'
|
|
647
|
-
end
|
|
648
|
-
|
|
649
|
-
context "Metasploit::Model::Module::Ancestor#payload_type" do
|
|
650
|
-
let(:few_error) do
|
|
651
|
-
"needs exactly one ancestor with payload_type (#{ancestor_payload_type}), " \
|
|
652
|
-
"but there are none."
|
|
653
|
-
end
|
|
654
|
-
|
|
655
|
-
let(:many_error) do
|
|
656
|
-
"needs exactly one ancestor with payload_type (#{ancestor_payload_type}), " \
|
|
657
|
-
"but there are #{ancestors.count} (#{ancestors.map(&:full_name).sort.to_sentence})"
|
|
658
|
-
end
|
|
659
|
-
|
|
660
|
-
context 'single' do
|
|
661
|
-
context 'without zero' do
|
|
662
|
-
let(:ancestor) do
|
|
663
|
-
FactoryGirl.create(single_payload_module_ancestor_factory)
|
|
664
|
-
end
|
|
665
|
-
|
|
666
|
-
let(:ancestors) do
|
|
667
|
-
[
|
|
668
|
-
ancestor
|
|
669
|
-
]
|
|
670
|
-
end
|
|
671
|
-
|
|
672
|
-
let(:error) do
|
|
673
|
-
"cannot have ancestors (#{ancestor.full_name}) " \
|
|
674
|
-
"with payload_type (#{ancestor.payload_type}) " \
|
|
675
|
-
"for class payload_type (#{payload_type}); " \
|
|
676
|
-
"only one stage and one stager ancestor is allowed"
|
|
677
|
-
end
|
|
678
|
-
|
|
679
|
-
it 'should record error on ancestors' do
|
|
680
|
-
module_class.valid?
|
|
681
|
-
|
|
682
|
-
module_class.errors[:ancestors].should include(error)
|
|
683
|
-
end
|
|
684
|
-
end
|
|
685
|
-
end
|
|
686
|
-
|
|
687
|
-
context 'stage' do
|
|
688
|
-
let(:ancestor_payload_type) do
|
|
689
|
-
'stage'
|
|
690
|
-
end
|
|
691
|
-
|
|
692
|
-
context 'with < 1' do
|
|
693
|
-
# 1 stager and 0 stages, so stages count < 1
|
|
694
|
-
let(:ancestors) do
|
|
695
|
-
[
|
|
696
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory)
|
|
697
|
-
]
|
|
698
|
-
end
|
|
699
|
-
|
|
700
|
-
it 'should record error on ancestors' do
|
|
701
|
-
module_class.errors[:ancestors].should include(few_error)
|
|
702
|
-
end
|
|
703
|
-
end
|
|
704
|
-
|
|
705
|
-
context 'with 1' do
|
|
706
|
-
# 1 stager and 1 stage, so stages count == 1
|
|
707
|
-
let(:ancestors) do
|
|
708
|
-
[
|
|
709
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory),
|
|
710
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory)
|
|
711
|
-
]
|
|
712
|
-
end
|
|
713
|
-
|
|
714
|
-
it 'should not record error on ancestors' do
|
|
715
|
-
module_class.errors[:ancestors].should_not include(few_error)
|
|
716
|
-
module_class.errors[:ancestors].should_not include(many_error)
|
|
717
|
-
end
|
|
718
|
-
end
|
|
719
|
-
|
|
720
|
-
context 'with > 1' do
|
|
721
|
-
# 0 stager, 2 stages, so stages count > 1
|
|
722
|
-
let(:ancestors) do
|
|
723
|
-
FactoryGirl.create_list(stage_payload_module_ancestor_factory, 2)
|
|
724
|
-
end
|
|
725
|
-
|
|
726
|
-
it 'should record error on ancestors' do
|
|
727
|
-
module_class.errors[:ancestors].should include(many_error)
|
|
728
|
-
end
|
|
729
|
-
end
|
|
730
|
-
end
|
|
731
|
-
|
|
732
|
-
context 'stager' do
|
|
733
|
-
let(:ancestor_payload_type) do
|
|
734
|
-
'stager'
|
|
735
|
-
end
|
|
736
|
-
|
|
737
|
-
context 'with < 1' do
|
|
738
|
-
# 0 stager and 1 stages, so stagers count < 1
|
|
739
|
-
let(:ancestors) do
|
|
740
|
-
[
|
|
741
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory)
|
|
742
|
-
]
|
|
743
|
-
end
|
|
744
|
-
|
|
745
|
-
it 'should record error on ancestors' do
|
|
746
|
-
module_class.errors[:ancestors].should include(few_error)
|
|
747
|
-
end
|
|
748
|
-
end
|
|
749
|
-
|
|
750
|
-
context 'with 1' do
|
|
751
|
-
# 1 stager and 1 stage, so stagers count == 1
|
|
752
|
-
let(:ancestors) do
|
|
753
|
-
[
|
|
754
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory),
|
|
755
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory)
|
|
756
|
-
]
|
|
757
|
-
end
|
|
758
|
-
|
|
759
|
-
it 'should not record error on ancestors' do
|
|
760
|
-
module_class.errors[:ancestors].should_not include(few_error)
|
|
761
|
-
module_class.errors[:ancestors].should_not include(many_error)
|
|
762
|
-
end
|
|
763
|
-
end
|
|
764
|
-
|
|
765
|
-
context 'with > 1' do
|
|
766
|
-
# 2 stagers, 0 stages, so stagers count > 1
|
|
767
|
-
let(:ancestors) do
|
|
768
|
-
FactoryGirl.create_list(stager_payload_module_ancestor_factory, 2)
|
|
769
|
-
end
|
|
770
|
-
|
|
771
|
-
it 'should record error on ancestors' do
|
|
772
|
-
module_class.errors[:ancestors].should include(many_error)
|
|
773
|
-
end
|
|
774
|
-
end
|
|
775
|
-
end
|
|
776
|
-
end
|
|
777
|
-
end
|
|
778
|
-
end
|
|
779
|
-
end
|
|
780
|
-
|
|
781
|
-
context "without 'payload' Metasploit::Model::Module::Class#module_type" do
|
|
782
|
-
let(:ancestors) do
|
|
783
|
-
[
|
|
784
|
-
ancestor
|
|
785
|
-
]
|
|
786
|
-
end
|
|
787
|
-
|
|
788
|
-
let(:error) do
|
|
789
|
-
"cannot have an ancestor (#{ancestor.full_name}) " \
|
|
790
|
-
"with a payload_type (#{ancestor.payload_type}) " \
|
|
791
|
-
"for class module_type (#{module_type})"
|
|
792
|
-
end
|
|
793
|
-
|
|
794
|
-
let(:module_type) do
|
|
795
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
796
|
-
end
|
|
797
|
-
|
|
798
|
-
before(:each) do
|
|
799
|
-
module_class.valid?
|
|
800
|
-
end
|
|
801
|
-
|
|
802
|
-
context 'with Metasploit::Model::Module::Ancestor#payload_type' do
|
|
803
|
-
let(:ancestor) do
|
|
804
|
-
FactoryGirl.create(payload_module_ancestor_factory)
|
|
805
|
-
end
|
|
806
|
-
|
|
807
|
-
it 'should record error on ancestors' do
|
|
808
|
-
module_class.errors[:ancestors].should include(error)
|
|
809
|
-
end
|
|
810
|
-
end
|
|
811
|
-
|
|
812
|
-
context 'without Metasploit::Model::Module::Ancestor#payload_type' do
|
|
813
|
-
let(:ancestor) do
|
|
814
|
-
FactoryGirl.create(non_payload_module_ancestor_factory)
|
|
815
|
-
end
|
|
816
|
-
|
|
817
|
-
it 'should not record error on ancestors' do
|
|
818
|
-
module_class.errors[:ancestors].should_not include(error)
|
|
819
|
-
end
|
|
820
|
-
end
|
|
821
|
-
end
|
|
822
|
-
end
|
|
823
|
-
end
|
|
824
|
-
|
|
825
|
-
context 'validates module_type inclusion in Metasploit::Model::Module::Ancestor::MODULE_TYPES' do
|
|
826
|
-
subject(:module_class) do
|
|
827
|
-
FactoryGirl.build(
|
|
828
|
-
module_class_factory,
|
|
829
|
-
:ancestors => [],
|
|
830
|
-
:module_type => module_type
|
|
831
|
-
)
|
|
832
|
-
end
|
|
833
|
-
|
|
834
|
-
let(:error) do
|
|
835
|
-
'is not included in the list'
|
|
836
|
-
end
|
|
837
|
-
|
|
838
|
-
before(:each) do
|
|
839
|
-
module_class.module_type = module_type
|
|
840
|
-
end
|
|
841
|
-
|
|
842
|
-
Metasploit::Model::Module::Type::ALL.each do |context_module_type|
|
|
843
|
-
context "with #{context_module_type}" do
|
|
844
|
-
let(:module_type) do
|
|
845
|
-
context_module_type
|
|
846
|
-
end
|
|
847
|
-
|
|
848
|
-
it 'should not record error on module_type' do
|
|
849
|
-
module_class.valid?
|
|
850
|
-
|
|
851
|
-
module_class.errors[:module_type].should_not include(error)
|
|
852
|
-
end
|
|
853
|
-
end
|
|
854
|
-
end
|
|
855
|
-
|
|
856
|
-
context 'without module_type' do
|
|
857
|
-
let(:module_type) do
|
|
858
|
-
nil
|
|
859
|
-
end
|
|
860
|
-
|
|
861
|
-
it { should_not be_valid }
|
|
862
|
-
|
|
863
|
-
it 'should record error on module_type' do
|
|
864
|
-
module_class.valid?
|
|
865
|
-
|
|
866
|
-
module_class.errors[:module_type].should include(error)
|
|
867
|
-
end
|
|
868
|
-
end
|
|
869
|
-
end
|
|
870
|
-
|
|
871
|
-
context 'payload_type' do
|
|
872
|
-
subject(:module_class) do
|
|
873
|
-
FactoryGirl.build(
|
|
874
|
-
module_class_factory,
|
|
875
|
-
:module_type => module_type
|
|
876
|
-
)
|
|
877
|
-
end
|
|
878
|
-
|
|
879
|
-
before(:each) do
|
|
880
|
-
module_class.payload_type = payload_type
|
|
881
|
-
end
|
|
882
|
-
|
|
883
|
-
context 'with payload' do
|
|
884
|
-
let(:module_type) do
|
|
885
|
-
'payload'
|
|
886
|
-
end
|
|
887
|
-
|
|
888
|
-
context 'with payload_type' do
|
|
889
|
-
subject(:module_class) do
|
|
890
|
-
FactoryGirl.build(
|
|
891
|
-
module_class_factory,
|
|
892
|
-
# Set explicitly so not derived from module_type and payload_type in factory, which will fail for the
|
|
893
|
-
# invalid payload_type test.
|
|
894
|
-
:ancestors => [],
|
|
895
|
-
:module_type => module_type,
|
|
896
|
-
:payload_type => payload_type
|
|
897
|
-
)
|
|
898
|
-
end
|
|
899
|
-
|
|
900
|
-
let(:error) do
|
|
901
|
-
'is not in list'
|
|
902
|
-
end
|
|
903
|
-
|
|
904
|
-
before(:each) do
|
|
905
|
-
# Set explicitly so not derived
|
|
906
|
-
module_class.payload_type = payload_type
|
|
907
|
-
end
|
|
908
|
-
|
|
909
|
-
context 'single' do
|
|
910
|
-
let(:payload_type) do
|
|
911
|
-
'single'
|
|
912
|
-
end
|
|
913
|
-
|
|
914
|
-
it 'should not record error' do
|
|
915
|
-
module_class.valid?
|
|
916
|
-
|
|
917
|
-
module_class.errors[:payload_type].should_not include(error)
|
|
918
|
-
end
|
|
919
|
-
end
|
|
920
|
-
|
|
921
|
-
context 'staged' do
|
|
922
|
-
let(:payload_type) do
|
|
923
|
-
'staged'
|
|
924
|
-
end
|
|
925
|
-
|
|
926
|
-
it 'should not record error on payload_type' do
|
|
927
|
-
module_class.valid?
|
|
928
|
-
|
|
929
|
-
module_class.errors[:payload_type].should_not include(error)
|
|
930
|
-
end
|
|
931
|
-
end
|
|
932
|
-
|
|
933
|
-
context 'other' do
|
|
934
|
-
let(:payload_type) do
|
|
935
|
-
'invalid_payload_type'
|
|
936
|
-
end
|
|
937
|
-
|
|
938
|
-
it 'should record error on payload_type' do
|
|
939
|
-
module_class.valid?
|
|
940
|
-
|
|
941
|
-
module_class.errors[:payload_type].should_not be_empty
|
|
942
|
-
end
|
|
943
|
-
end
|
|
944
|
-
end
|
|
945
|
-
end
|
|
946
|
-
|
|
947
|
-
context 'without payload' do
|
|
948
|
-
let(:error) do
|
|
949
|
-
'must be nil'
|
|
950
|
-
end
|
|
951
|
-
|
|
952
|
-
let(:module_type) do
|
|
953
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
954
|
-
end
|
|
955
|
-
|
|
956
|
-
before(:each) do
|
|
957
|
-
module_class.payload_type = payload_type
|
|
958
|
-
end
|
|
959
|
-
|
|
960
|
-
context 'with payload_type' do
|
|
961
|
-
let(:payload_type) do
|
|
962
|
-
FactoryGirl.generate :metasploit_model_module_class_payload_type
|
|
963
|
-
end
|
|
964
|
-
|
|
965
|
-
it 'should record error on payload_type' do
|
|
966
|
-
module_class.valid?
|
|
967
|
-
|
|
968
|
-
module_class.errors[:payload_type].should include(error)
|
|
969
|
-
end
|
|
970
|
-
end
|
|
971
|
-
|
|
972
|
-
context 'without payload_type' do
|
|
973
|
-
let(:payload_type) do
|
|
974
|
-
nil
|
|
975
|
-
end
|
|
976
|
-
|
|
977
|
-
it 'should not error on payload_type' do
|
|
978
|
-
module_class.valid?
|
|
979
|
-
|
|
980
|
-
module_class.errors[:payload_type].should_not include(error)
|
|
981
|
-
end
|
|
982
|
-
|
|
983
|
-
end
|
|
984
|
-
end
|
|
985
|
-
end
|
|
986
|
-
|
|
987
|
-
it { should validate_presence_of(:rank) }
|
|
988
|
-
|
|
989
|
-
context 'with nil derived_reference_name' do
|
|
990
|
-
before(:each) do
|
|
991
|
-
module_class.stub(:derived_reference_name => nil)
|
|
992
|
-
end
|
|
993
|
-
|
|
994
|
-
it { should validate_presence_of(:reference_name) }
|
|
995
|
-
end
|
|
996
|
-
end
|
|
997
|
-
|
|
998
|
-
context '#derived_module_type' do
|
|
999
|
-
subject(:derived_module_type) do
|
|
1000
|
-
module_class.derived_module_type
|
|
1001
|
-
end
|
|
1002
|
-
|
|
1003
|
-
context 'ancestors' do
|
|
1004
|
-
before(:each) do
|
|
1005
|
-
module_class.ancestors = ancestors
|
|
1006
|
-
end
|
|
1007
|
-
|
|
1008
|
-
context 'empty' do
|
|
1009
|
-
let(:ancestors) do
|
|
1010
|
-
[]
|
|
1011
|
-
end
|
|
1012
|
-
|
|
1013
|
-
it { should be_nil }
|
|
1014
|
-
end
|
|
1015
|
-
|
|
1016
|
-
context 'non-empty' do
|
|
1017
|
-
context 'with same Metasploit::Model::Module::Ancestor#module_type' do
|
|
1018
|
-
let(:ancestors) do
|
|
1019
|
-
FactoryGirl.create_list(module_ancestor_factory, 2, :module_type => module_type)
|
|
1020
|
-
end
|
|
1021
|
-
|
|
1022
|
-
let(:module_type) do
|
|
1023
|
-
FactoryGirl.generate :metasploit_model_module_type
|
|
1024
|
-
end
|
|
1025
|
-
|
|
1026
|
-
it 'should return shared module_type' do
|
|
1027
|
-
derived_module_type.should == module_type
|
|
1028
|
-
end
|
|
1029
|
-
end
|
|
1030
|
-
|
|
1031
|
-
context 'with different Metasploit::Model::Module;:Ancestor#module_type' do
|
|
1032
|
-
let(:ancestors) do
|
|
1033
|
-
FactoryGirl.create_list(module_ancestor_factory, 2)
|
|
1034
|
-
end
|
|
1035
|
-
|
|
1036
|
-
it 'should return nil because there is no consensus' do
|
|
1037
|
-
derived_module_type.should be_nil
|
|
1038
|
-
end
|
|
1039
|
-
end
|
|
1040
|
-
end
|
|
1041
|
-
end
|
|
1042
|
-
end
|
|
1043
|
-
|
|
1044
|
-
context '#derived_payload_type' do
|
|
1045
|
-
subject(:derived_payload_type) do
|
|
1046
|
-
module_class.derived_payload_type
|
|
1047
|
-
end
|
|
1048
|
-
|
|
1049
|
-
before(:each) do
|
|
1050
|
-
module_class.module_type = module_type
|
|
1051
|
-
end
|
|
1052
|
-
|
|
1053
|
-
context 'with payload' do
|
|
1054
|
-
let(:module_type) do
|
|
1055
|
-
'payload'
|
|
1056
|
-
end
|
|
1057
|
-
|
|
1058
|
-
before(:each) do
|
|
1059
|
-
module_class.ancestors = ancestors
|
|
1060
|
-
end
|
|
1061
|
-
|
|
1062
|
-
context 'with 1 ancestor' do
|
|
1063
|
-
let(:ancestors) do
|
|
1064
|
-
[
|
|
1065
|
-
FactoryGirl.create(
|
|
1066
|
-
module_ancestor_factory,
|
|
1067
|
-
:module_type => 'payload',
|
|
1068
|
-
:payload_type => payload_type
|
|
1069
|
-
)
|
|
1070
|
-
]
|
|
1071
|
-
end
|
|
1072
|
-
|
|
1073
|
-
context 'with single' do
|
|
1074
|
-
let(:payload_type) do
|
|
1075
|
-
'single'
|
|
1076
|
-
end
|
|
1077
|
-
|
|
1078
|
-
it { should == 'single' }
|
|
1079
|
-
end
|
|
1080
|
-
|
|
1081
|
-
context 'without single' do
|
|
1082
|
-
let(:payload_type) do
|
|
1083
|
-
'stage'
|
|
1084
|
-
end
|
|
1085
|
-
|
|
1086
|
-
it { should be_nil }
|
|
1087
|
-
end
|
|
1088
|
-
end
|
|
1089
|
-
|
|
1090
|
-
context 'with 2 ancestors' do
|
|
1091
|
-
context 'with stager and stage' do
|
|
1092
|
-
let(:ancestors) do
|
|
1093
|
-
['stager', 'stage'].collect { |payload_type|
|
|
1094
|
-
FactoryGirl.create(
|
|
1095
|
-
payload_module_ancestor_factory,
|
|
1096
|
-
:payload_type => payload_type
|
|
1097
|
-
)
|
|
1098
|
-
}
|
|
1099
|
-
end
|
|
1100
|
-
|
|
1101
|
-
it { should == 'staged' }
|
|
1102
|
-
end
|
|
1103
|
-
|
|
1104
|
-
context 'without stager and stage' do
|
|
1105
|
-
let(:ancestors) do
|
|
1106
|
-
FactoryGirl.create_list(
|
|
1107
|
-
payload_module_ancestor_factory,
|
|
1108
|
-
2,
|
|
1109
|
-
:payload_type => 'stage'
|
|
1110
|
-
)
|
|
1111
|
-
end
|
|
1112
|
-
|
|
1113
|
-
it { should be_nil }
|
|
1114
|
-
end
|
|
1115
|
-
end
|
|
1116
|
-
end
|
|
1117
|
-
|
|
1118
|
-
context 'without payload' do
|
|
1119
|
-
let(:module_type) do
|
|
1120
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
1121
|
-
end
|
|
1122
|
-
end
|
|
1123
|
-
end
|
|
1124
|
-
|
|
1125
|
-
context '#derived_reference_name' do
|
|
1126
|
-
subject(:derived_reference_name) do
|
|
1127
|
-
module_class.derived_reference_name
|
|
1128
|
-
end
|
|
1129
|
-
|
|
1130
|
-
before(:each) do
|
|
1131
|
-
module_class.module_type = module_type
|
|
1132
|
-
end
|
|
1133
|
-
|
|
1134
|
-
context 'with payload' do
|
|
1135
|
-
let(:module_type) do
|
|
1136
|
-
'payload'
|
|
1137
|
-
end
|
|
1138
|
-
|
|
1139
|
-
before(:each) do
|
|
1140
|
-
module_class.payload_type = payload_type
|
|
1141
|
-
end
|
|
1142
|
-
|
|
1143
|
-
context 'with single' do
|
|
1144
|
-
let(:payload_type) do
|
|
1145
|
-
'single'
|
|
1146
|
-
end
|
|
1147
|
-
|
|
1148
|
-
it 'should call #derived_single_payload_reference_name' do
|
|
1149
|
-
module_class.should_receive(:derived_single_payload_reference_name)
|
|
1150
|
-
|
|
1151
|
-
derived_reference_name
|
|
1152
|
-
end
|
|
1153
|
-
end
|
|
1154
|
-
|
|
1155
|
-
context 'with staged' do
|
|
1156
|
-
let(:payload_type) do
|
|
1157
|
-
'staged'
|
|
1158
|
-
end
|
|
1159
|
-
|
|
1160
|
-
it 'should call #derived_staged_payload_reference_name' do
|
|
1161
|
-
module_class.should_receive(:derived_staged_payload_reference_name)
|
|
1162
|
-
|
|
1163
|
-
derived_reference_name
|
|
1164
|
-
end
|
|
1165
|
-
end
|
|
1166
|
-
|
|
1167
|
-
context 'without single or staged' do
|
|
1168
|
-
let(:payload_type) do
|
|
1169
|
-
'invalid_payload_type'
|
|
1170
|
-
end
|
|
1171
|
-
|
|
1172
|
-
it { should be_nil }
|
|
1173
|
-
end
|
|
1174
|
-
end
|
|
1175
|
-
|
|
1176
|
-
context 'without payload' do
|
|
1177
|
-
let(:module_type) do
|
|
1178
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
1179
|
-
end
|
|
1180
|
-
|
|
1181
|
-
before(:each) do
|
|
1182
|
-
module_class.ancestors = ancestors
|
|
1183
|
-
end
|
|
1184
|
-
|
|
1185
|
-
context 'with 1 ancestor' do
|
|
1186
|
-
let(:ancestor) do
|
|
1187
|
-
FactoryGirl.create(non_payload_module_ancestor_factory)
|
|
1188
|
-
end
|
|
1189
|
-
|
|
1190
|
-
let(:ancestors) do
|
|
1191
|
-
[
|
|
1192
|
-
ancestor
|
|
1193
|
-
]
|
|
1194
|
-
end
|
|
1195
|
-
|
|
1196
|
-
it 'should return reference_name of ancestor' do
|
|
1197
|
-
derived_reference_name.should == ancestor.reference_name
|
|
1198
|
-
end
|
|
1199
|
-
end
|
|
1200
|
-
|
|
1201
|
-
context 'without 1 ancestor' do
|
|
1202
|
-
let(:ancestors) do
|
|
1203
|
-
FactoryGirl.create_list(module_ancestor_factory, 2)
|
|
1204
|
-
end
|
|
1205
|
-
|
|
1206
|
-
it { should be_nil }
|
|
1207
|
-
end
|
|
1208
|
-
end
|
|
1209
|
-
end
|
|
1210
|
-
|
|
1211
|
-
context '#derived_single_payload_reference_name' do
|
|
1212
|
-
subject(:derived_single_payload_reference_name) do
|
|
1213
|
-
module_class.send(:derived_single_payload_reference_name)
|
|
1214
|
-
end
|
|
1215
|
-
|
|
1216
|
-
before(:each) do
|
|
1217
|
-
module_class.ancestors = ancestors
|
|
1218
|
-
end
|
|
1219
|
-
|
|
1220
|
-
context 'with 1 ancestor' do
|
|
1221
|
-
let(:ancestor) do
|
|
1222
|
-
FactoryGirl.create(
|
|
1223
|
-
payload_module_ancestor_factory,
|
|
1224
|
-
:payload_type => payload_type
|
|
1225
|
-
)
|
|
1226
|
-
end
|
|
1227
|
-
|
|
1228
|
-
let(:ancestors) do
|
|
1229
|
-
[
|
|
1230
|
-
ancestor
|
|
1231
|
-
]
|
|
1232
|
-
end
|
|
1233
|
-
|
|
1234
|
-
context 'with single' do
|
|
1235
|
-
let(:payload_type) do
|
|
1236
|
-
'single'
|
|
1237
|
-
end
|
|
1238
|
-
|
|
1239
|
-
before(:each) do
|
|
1240
|
-
ancestor.reference_name = reference_name
|
|
1241
|
-
end
|
|
1242
|
-
|
|
1243
|
-
context 'with reference_name' do
|
|
1244
|
-
let(:payload_name) do
|
|
1245
|
-
'payload/name'
|
|
1246
|
-
end
|
|
1247
|
-
|
|
1248
|
-
let(:payload_type_directory) do
|
|
1249
|
-
'singles'
|
|
1250
|
-
end
|
|
1251
|
-
|
|
1252
|
-
let(:reference_name) do
|
|
1253
|
-
"#{payload_type_directory}/#{payload_name}"
|
|
1254
|
-
end
|
|
1255
|
-
|
|
1256
|
-
it 'should return Metasploit::Model::Module::Ancestor#payload_name' do
|
|
1257
|
-
expect(derived_single_payload_reference_name).to eq(payload_name)
|
|
1258
|
-
end
|
|
1259
|
-
end
|
|
1260
|
-
|
|
1261
|
-
context 'without reference_name' do
|
|
1262
|
-
let(:reference_name) do
|
|
1263
|
-
nil
|
|
1264
|
-
end
|
|
1265
|
-
end
|
|
1266
|
-
|
|
1267
|
-
end
|
|
1268
|
-
|
|
1269
|
-
context 'without single' do
|
|
1270
|
-
let(:payload_type) do
|
|
1271
|
-
'stage'
|
|
1272
|
-
end
|
|
1273
|
-
|
|
1274
|
-
it { should be_nil }
|
|
1275
|
-
end
|
|
1276
|
-
end
|
|
1277
|
-
|
|
1278
|
-
context 'without 1 ancestor' do
|
|
1279
|
-
let(:ancestors) do
|
|
1280
|
-
[]
|
|
1281
|
-
end
|
|
1282
|
-
|
|
1283
|
-
it { should be_nil }
|
|
1284
|
-
end
|
|
1285
|
-
end
|
|
1286
|
-
|
|
1287
|
-
context '#derived_staged_payload_reference_name' do
|
|
1288
|
-
subject(:derived_staged_payload_reference_name) do
|
|
1289
|
-
module_class.send(:derived_staged_payload_reference_name)
|
|
1290
|
-
end
|
|
1291
|
-
|
|
1292
|
-
before(:each) do
|
|
1293
|
-
module_class.ancestors = ancestors
|
|
1294
|
-
end
|
|
1295
|
-
|
|
1296
|
-
context 'with 2 ancestors' do
|
|
1297
|
-
context 'with 1 stage' do
|
|
1298
|
-
let(:stage_ancestor) do
|
|
1299
|
-
FactoryGirl.create(stage_payload_module_ancestor_factory)
|
|
1300
|
-
end
|
|
1301
|
-
|
|
1302
|
-
before(:each) do
|
|
1303
|
-
stage_ancestor.reference_name = stage_reference_name
|
|
1304
|
-
end
|
|
1305
|
-
|
|
1306
|
-
context 'with reference_name' do
|
|
1307
|
-
let(:stage_payload_name) do
|
|
1308
|
-
'payload/name'
|
|
1309
|
-
end
|
|
1310
|
-
|
|
1311
|
-
let(:stage_reference_name) do
|
|
1312
|
-
"#{stage_type_directory}/#{stage_payload_name}"
|
|
1313
|
-
end
|
|
1314
|
-
|
|
1315
|
-
let(:stage_type_directory) do
|
|
1316
|
-
'stages'
|
|
1317
|
-
end
|
|
1318
|
-
|
|
1319
|
-
context 'with 1 stager' do
|
|
1320
|
-
let(:ancestors) do
|
|
1321
|
-
[
|
|
1322
|
-
stager_ancestor,
|
|
1323
|
-
stage_ancestor
|
|
1324
|
-
]
|
|
1325
|
-
end
|
|
1326
|
-
|
|
1327
|
-
let(:stager_ancestor) do
|
|
1328
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory)
|
|
1329
|
-
end
|
|
1330
|
-
|
|
1331
|
-
before(:each) do
|
|
1332
|
-
stager_ancestor.handler_type = stager_handler_type
|
|
1333
|
-
end
|
|
1334
|
-
|
|
1335
|
-
context 'with handler_type' do
|
|
1336
|
-
let(:stager_handler_type) do
|
|
1337
|
-
FactoryGirl.generate :metasploit_model_module_handler_type
|
|
1338
|
-
end
|
|
1339
|
-
|
|
1340
|
-
it 'should be <stage.payload_name>/<stager.handler_type>' do
|
|
1341
|
-
expect(derived_staged_payload_reference_name).to eq("#{stage_payload_name}/#{stager_handler_type}")
|
|
1342
|
-
end
|
|
1343
|
-
end
|
|
1344
|
-
|
|
1345
|
-
context 'without handler_type' do
|
|
1346
|
-
let(:stager_handler_type) do
|
|
1347
|
-
nil
|
|
1348
|
-
end
|
|
1349
|
-
|
|
1350
|
-
it { should be_nil }
|
|
1351
|
-
end
|
|
1352
|
-
end
|
|
1353
|
-
|
|
1354
|
-
context 'without 1 stager' do
|
|
1355
|
-
let(:ancestors) do
|
|
1356
|
-
[
|
|
1357
|
-
stage_ancestor,
|
|
1358
|
-
FactoryGirl.create(single_payload_module_ancestor_factory)
|
|
1359
|
-
]
|
|
1360
|
-
end
|
|
1361
|
-
|
|
1362
|
-
it { should be_nil }
|
|
1363
|
-
end
|
|
1364
|
-
end
|
|
1365
|
-
|
|
1366
|
-
context 'without reference_name' do
|
|
1367
|
-
let(:ancestors) do
|
|
1368
|
-
[
|
|
1369
|
-
FactoryGirl.create(stager_payload_module_ancestor_factory),
|
|
1370
|
-
stage_ancestor
|
|
1371
|
-
]
|
|
1372
|
-
end
|
|
1373
|
-
|
|
1374
|
-
let(:stage_reference_name) do
|
|
1375
|
-
nil
|
|
1376
|
-
end
|
|
1377
|
-
|
|
1378
|
-
it { should be_nil }
|
|
1379
|
-
end
|
|
1380
|
-
end
|
|
1381
|
-
|
|
1382
|
-
context 'without 1 stage' do
|
|
1383
|
-
let(:ancestors) do
|
|
1384
|
-
FactoryGirl.create_list(stager_payload_module_ancestor_factory, 2)
|
|
1385
|
-
end
|
|
1386
|
-
|
|
1387
|
-
it { should be_nil }
|
|
1388
|
-
end
|
|
1389
|
-
end
|
|
1390
|
-
|
|
1391
|
-
context 'without 2 ancestors' do
|
|
1392
|
-
let(:ancestors) do
|
|
1393
|
-
FactoryGirl.create_list(module_ancestor_factory, 3)
|
|
1394
|
-
end
|
|
1395
|
-
|
|
1396
|
-
it { should be_nil }
|
|
1397
|
-
end
|
|
1398
|
-
end
|
|
1399
|
-
|
|
1400
|
-
context '#payload?' do
|
|
1401
|
-
subject(:payload?) do
|
|
1402
|
-
module_class.payload?
|
|
1403
|
-
end
|
|
1404
|
-
|
|
1405
|
-
# use new instead of factory so that payload? won't be called in the background to show this context supplies
|
|
1406
|
-
# coverage
|
|
1407
|
-
let(:module_class) do
|
|
1408
|
-
module_class_class.new
|
|
1409
|
-
end
|
|
1410
|
-
|
|
1411
|
-
before(:each) do
|
|
1412
|
-
module_class.module_type = module_type
|
|
1413
|
-
end
|
|
1414
|
-
|
|
1415
|
-
context 'with payload' do
|
|
1416
|
-
let(:module_type) do
|
|
1417
|
-
'payload'
|
|
1418
|
-
end
|
|
1419
|
-
|
|
1420
|
-
it { should be_true }
|
|
1421
|
-
end
|
|
1422
|
-
|
|
1423
|
-
context 'without payload' do
|
|
1424
|
-
let(:module_type) do
|
|
1425
|
-
FactoryGirl.generate :metasploit_model_non_payload_module_type
|
|
1426
|
-
end
|
|
1427
|
-
|
|
1428
|
-
it { should be_false }
|
|
1429
|
-
end
|
|
1430
|
-
end
|
|
1431
|
-
|
|
1432
|
-
context '#staged_payload_type_count' do
|
|
1433
|
-
subject(:staged_payload_type_count) do
|
|
1434
|
-
module_class.send(
|
|
1435
|
-
:staged_payload_type_count,
|
|
1436
|
-
ancestors_by_payload_type,
|
|
1437
|
-
ancestor_payload_type
|
|
1438
|
-
)
|
|
1439
|
-
end
|
|
1440
|
-
|
|
1441
|
-
let(:ancestor_payload_type) do
|
|
1442
|
-
FactoryGirl.generate :metasploit_model_module_ancestor_payload_type
|
|
1443
|
-
end
|
|
1444
|
-
|
|
1445
|
-
before(:each) do
|
|
1446
|
-
staged_payload_type_count
|
|
1447
|
-
end
|
|
1448
|
-
|
|
1449
|
-
context 'with ancestors with payload_type' do
|
|
1450
|
-
context 'with 1' do
|
|
1451
|
-
let(:ancestors_by_payload_type) do
|
|
1452
|
-
{
|
|
1453
|
-
ancestor_payload_type => FactoryGirl.create_list(
|
|
1454
|
-
payload_module_ancestor_factory,
|
|
1455
|
-
1,
|
|
1456
|
-
:payload_type => ancestor_payload_type
|
|
1457
|
-
)
|
|
1458
|
-
}
|
|
1459
|
-
end
|
|
1460
|
-
|
|
1461
|
-
it 'should not record error on ancestors' do
|
|
1462
|
-
module_class.errors[:ancestors].should be_empty
|
|
1463
|
-
end
|
|
1464
|
-
end
|
|
1465
|
-
|
|
1466
|
-
context 'without 1' do
|
|
1467
|
-
let(:ancestors_by_payload_type) do
|
|
1468
|
-
{
|
|
1469
|
-
ancestor_payload_type => payload_type_ancestors
|
|
1470
|
-
}
|
|
1471
|
-
end
|
|
1472
|
-
|
|
1473
|
-
let(:full_name_sentence) do
|
|
1474
|
-
payload_type_ancestors.map(&:full_name).sort.to_sentence
|
|
1475
|
-
end
|
|
1476
|
-
|
|
1477
|
-
let(:payload_type_ancestors) do
|
|
1478
|
-
FactoryGirl.create_list(
|
|
1479
|
-
payload_module_ancestor_factory,
|
|
1480
|
-
payload_type_ancestor_count,
|
|
1481
|
-
:payload_type => ancestor_payload_type
|
|
1482
|
-
)
|
|
1483
|
-
end
|
|
1484
|
-
|
|
1485
|
-
let(:payload_type_ancestor_count) do
|
|
1486
|
-
2
|
|
1487
|
-
end
|
|
1488
|
-
|
|
1489
|
-
let(:error) do
|
|
1490
|
-
"needs exactly one ancestor with payload_type (#{ancestor_payload_type}), " \
|
|
1491
|
-
"but there are #{payload_type_ancestor_count} (#{full_name_sentence})"
|
|
1492
|
-
end
|
|
1493
|
-
|
|
1494
|
-
it 'should record error on ancestors' do
|
|
1495
|
-
module_class.errors[:ancestors].should include(error)
|
|
1496
|
-
end
|
|
1497
|
-
end
|
|
1498
|
-
end
|
|
1499
|
-
|
|
1500
|
-
context 'without ancestors with payload_type' do
|
|
1501
|
-
let(:ancestors_by_payload_type) do
|
|
1502
|
-
{}
|
|
1503
|
-
end
|
|
1504
|
-
|
|
1505
|
-
let(:error) do
|
|
1506
|
-
"needs exactly one ancestor with payload_type (#{ancestor_payload_type}), but there are none."
|
|
1507
|
-
end
|
|
1508
|
-
|
|
1509
|
-
it 'should record error on ancestors' do
|
|
1510
|
-
module_class.errors[:ancestors].should include(error)
|
|
1511
|
-
end
|
|
1512
|
-
end
|
|
1513
|
-
end
|
|
1514
|
-
end
|