metasploit-model 0.28.0 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +3 -1
  3. data/config/locales/en.yml +0 -171
  4. data/lib/metasploit/model.rb +0 -2
  5. data/lib/metasploit/model/spec.rb +0 -130
  6. data/lib/metasploit/model/version.rb +1 -1
  7. data/spec/support/shared/examples/metasploit/model/search/operator/help.rb +4 -6
  8. data/spec/support/shared/examples/metasploit/model/translation.rb +1 -1
  9. data/spec/support/shared/examples/search_association.rb +1 -1
  10. data/spec/support/shared/examples/search_with.rb +4 -2
  11. metadata +3 -349
  12. data/app/models/metasploit/model/module/ancestor/spec/template.rb +0 -125
  13. data/app/models/metasploit/model/module/class/spec/template.rb +0 -92
  14. data/app/models/metasploit/model/module/instance/spec/template.rb +0 -97
  15. data/app/models/metasploit/model/spec/template.rb +0 -277
  16. data/app/validators/derivation_validator.rb +0 -17
  17. data/app/validators/dynamic_length_validator.rb +0 -45
  18. data/lib/metasploit/model/architecture.rb +0 -342
  19. data/lib/metasploit/model/author.rb +0 -54
  20. data/lib/metasploit/model/authority.rb +0 -141
  21. data/lib/metasploit/model/authority/bid.rb +0 -10
  22. data/lib/metasploit/model/authority/cve.rb +0 -10
  23. data/lib/metasploit/model/authority/msb.rb +0 -10
  24. data/lib/metasploit/model/authority/osvdb.rb +0 -10
  25. data/lib/metasploit/model/authority/pmasa.rb +0 -10
  26. data/lib/metasploit/model/authority/secunia.rb +0 -10
  27. data/lib/metasploit/model/authority/us_cert_vu.rb +0 -10
  28. data/lib/metasploit/model/authority/waraxe.rb +0 -31
  29. data/lib/metasploit/model/authority/zdi.rb +0 -10
  30. data/lib/metasploit/model/derivation.rb +0 -109
  31. data/lib/metasploit/model/derivation/full_name.rb +0 -19
  32. data/lib/metasploit/model/email_address.rb +0 -124
  33. data/lib/metasploit/model/module.rb +0 -20
  34. data/lib/metasploit/model/module/action.rb +0 -52
  35. data/lib/metasploit/model/module/ancestor.rb +0 -491
  36. data/lib/metasploit/model/module/ancestor/spec.rb +0 -6
  37. data/lib/metasploit/model/module/architecture.rb +0 -34
  38. data/lib/metasploit/model/module/author.rb +0 -40
  39. data/lib/metasploit/model/module/class.rb +0 -403
  40. data/lib/metasploit/model/module/class/spec.rb +0 -6
  41. data/lib/metasploit/model/module/handler.rb +0 -29
  42. data/lib/metasploit/model/module/instance.rb +0 -622
  43. data/lib/metasploit/model/module/instance/spec.rb +0 -6
  44. data/lib/metasploit/model/module/path.rb +0 -159
  45. data/lib/metasploit/model/module/platform.rb +0 -32
  46. data/lib/metasploit/model/module/rank.rb +0 -85
  47. data/lib/metasploit/model/module/reference.rb +0 -32
  48. data/lib/metasploit/model/module/stance.rb +0 -16
  49. data/lib/metasploit/model/module/target.rb +0 -78
  50. data/lib/metasploit/model/module/target/architecture.rb +0 -34
  51. data/lib/metasploit/model/module/target/platform.rb +0 -34
  52. data/lib/metasploit/model/module/type.rb +0 -38
  53. data/lib/metasploit/model/platform.rb +0 -246
  54. data/lib/metasploit/model/real_pathname.rb +0 -16
  55. data/lib/metasploit/model/reference.rb +0 -104
  56. data/spec/app/models/metasploit/model/module/ancestor/spec/template_spec.rb +0 -174
  57. data/spec/app/models/metasploit/model/module/class/spec/template_spec.rb +0 -222
  58. data/spec/app/models/metasploit/model/module/instance/spec/template_spec.rb +0 -201
  59. data/spec/app/models/metasploit/model/search/operator/deprecated/app_spec.rb +0 -62
  60. data/spec/app/models/metasploit/model/search/operator/deprecated/author_spec.rb +0 -197
  61. data/spec/app/models/metasploit/model/search/operator/deprecated/authority_spec.rb +0 -135
  62. data/spec/app/models/metasploit/model/search/operator/deprecated/platform_spec.rb +0 -124
  63. data/spec/app/models/metasploit/model/search/operator/deprecated/ref_spec.rb +0 -387
  64. data/spec/app/models/metasploit/model/search/operator/deprecated/text_spec.rb +0 -399
  65. data/spec/app/models/metasploit/model/spec/template_spec.rb +0 -23
  66. data/spec/app/validators/derivation_validator_spec.rb +0 -92
  67. data/spec/app/validators/dynamic_length_validator_spec.rb +0 -293
  68. data/spec/dummy/app/models/dummy/architecture.rb +0 -92
  69. data/spec/dummy/app/models/dummy/author.rb +0 -15
  70. data/spec/dummy/app/models/dummy/authority.rb +0 -130
  71. data/spec/dummy/app/models/dummy/email_address.rb +0 -27
  72. data/spec/dummy/app/models/dummy/module/action.rb +0 -25
  73. data/spec/dummy/app/models/dummy/module/ancestor.rb +0 -67
  74. data/spec/dummy/app/models/dummy/module/architecture.rb +0 -19
  75. data/spec/dummy/app/models/dummy/module/author.rb +0 -28
  76. data/spec/dummy/app/models/dummy/module/class.rb +0 -69
  77. data/spec/dummy/app/models/dummy/module/instance.rb +0 -209
  78. data/spec/dummy/app/models/dummy/module/path.rb +0 -64
  79. data/spec/dummy/app/models/dummy/module/platform.rb +0 -19
  80. data/spec/dummy/app/models/dummy/module/rank.rb +0 -44
  81. data/spec/dummy/app/models/dummy/module/reference.rb +0 -19
  82. data/spec/dummy/app/models/dummy/module/target.rb +0 -62
  83. data/spec/dummy/app/models/dummy/module/target/architecture.rb +0 -19
  84. data/spec/dummy/app/models/dummy/module/target/platform.rb +0 -19
  85. data/spec/dummy/app/models/dummy/platform.rb +0 -58
  86. data/spec/dummy/app/models/dummy/reference.rb +0 -31
  87. data/spec/dummy/spec/factories/dummy/architectures.rb +0 -13
  88. data/spec/dummy/spec/factories/dummy/authorities.rb +0 -32
  89. data/spec/dummy/spec/factories/dummy/authors.rb +0 -8
  90. data/spec/dummy/spec/factories/dummy/email_addresses.rb +0 -8
  91. data/spec/dummy/spec/factories/dummy/module/actions.rb +0 -13
  92. data/spec/dummy/spec/factories/dummy/module/ancestors.rb +0 -45
  93. data/spec/dummy/spec/factories/dummy/module/architectures.rb +0 -35
  94. data/spec/dummy/spec/factories/dummy/module/authors.rb +0 -10
  95. data/spec/dummy/spec/factories/dummy/module/classes.rb +0 -40
  96. data/spec/dummy/spec/factories/dummy/module/instances.rb +0 -86
  97. data/spec/dummy/spec/factories/dummy/module/paths.rb +0 -16
  98. data/spec/dummy/spec/factories/dummy/module/platforms.rb +0 -35
  99. data/spec/dummy/spec/factories/dummy/module/ranks.rb +0 -14
  100. data/spec/dummy/spec/factories/dummy/module/references.rb +0 -17
  101. data/spec/dummy/spec/factories/dummy/module/target/architectures.rb +0 -40
  102. data/spec/dummy/spec/factories/dummy/module/target/platforms.rb +0 -41
  103. data/spec/dummy/spec/factories/dummy/module/targets.rb +0 -46
  104. data/spec/dummy/spec/factories/dummy/platforms.rb +0 -3
  105. data/spec/dummy/spec/factories/dummy/references.rb +0 -26
  106. data/spec/factories/metasploit/model/architectures.rb +0 -6
  107. data/spec/factories/metasploit/model/authorities.rb +0 -28
  108. data/spec/factories/metasploit/model/authors.rb +0 -9
  109. data/spec/factories/metasploit/model/email_addresses.rb +0 -14
  110. data/spec/factories/metasploit/model/module/actions.rb +0 -9
  111. data/spec/factories/metasploit/model/module/ancestors.rb +0 -180
  112. data/spec/factories/metasploit/model/module/architectures.rb +0 -15
  113. data/spec/factories/metasploit/model/module/classes.rb +0 -47
  114. data/spec/factories/metasploit/model/module/handlers.rb +0 -3
  115. data/spec/factories/metasploit/model/module/instances.rb +0 -83
  116. data/spec/factories/metasploit/model/module/paths.rb +0 -51
  117. data/spec/factories/metasploit/model/module/platforms.rb +0 -15
  118. data/spec/factories/metasploit/model/module/ranks.rb +0 -9
  119. data/spec/factories/metasploit/model/module/references.rb +0 -11
  120. data/spec/factories/metasploit/model/module/stances.rb +0 -3
  121. data/spec/factories/metasploit/model/module/targets.rb +0 -22
  122. data/spec/factories/metasploit/model/module/types.rb +0 -5
  123. data/spec/factories/metasploit/model/references.rb +0 -88
  124. data/spec/lib/metasploit/model/architecture_spec.rb +0 -52
  125. data/spec/lib/metasploit/model/author_spec.rb +0 -6
  126. data/spec/lib/metasploit/model/authority/bid_spec.rb +0 -17
  127. data/spec/lib/metasploit/model/authority/cve_spec.rb +0 -17
  128. data/spec/lib/metasploit/model/authority/msb_spec.rb +0 -17
  129. data/spec/lib/metasploit/model/authority/osvdb_spec.rb +0 -17
  130. data/spec/lib/metasploit/model/authority/pmasa_spec.rb +0 -17
  131. data/spec/lib/metasploit/model/authority/secunia_spec.rb +0 -17
  132. data/spec/lib/metasploit/model/authority/us_cert_vu_spec.rb +0 -17
  133. data/spec/lib/metasploit/model/authority/waraxe_spec.rb +0 -51
  134. data/spec/lib/metasploit/model/authority/zdi_spec.rb +0 -21
  135. data/spec/lib/metasploit/model/authority_spec.rb +0 -10
  136. data/spec/lib/metasploit/model/derivation/full_name_spec.rb +0 -75
  137. data/spec/lib/metasploit/model/derivation_spec.rb +0 -217
  138. data/spec/lib/metasploit/model/email_address_spec.rb +0 -19
  139. data/spec/lib/metasploit/model/module/action_spec.rb +0 -6
  140. data/spec/lib/metasploit/model/module/ancestor_spec.rb +0 -6
  141. data/spec/lib/metasploit/model/module/architecture_spec.rb +0 -9
  142. data/spec/lib/metasploit/model/module/author_spec.rb +0 -6
  143. data/spec/lib/metasploit/model/module/class_spec.rb +0 -19
  144. data/spec/lib/metasploit/model/module/handler_spec.rb +0 -61
  145. data/spec/lib/metasploit/model/module/instance_spec.rb +0 -183
  146. data/spec/lib/metasploit/model/module/path_spec.rb +0 -6
  147. data/spec/lib/metasploit/model/module/platform_spec.rb +0 -9
  148. data/spec/lib/metasploit/model/module/rank_spec.rb +0 -29
  149. data/spec/lib/metasploit/model/module/reference_spec.rb +0 -9
  150. data/spec/lib/metasploit/model/module/stance_spec.rb +0 -30
  151. data/spec/lib/metasploit/model/module/target/architecture_spec.rb +0 -9
  152. data/spec/lib/metasploit/model/module/target/platform_spec.rb +0 -9
  153. data/spec/lib/metasploit/model/module/target_spec.rb +0 -9
  154. data/spec/lib/metasploit/model/module/type_spec.rb +0 -125
  155. data/spec/lib/metasploit/model/platform_spec.rb +0 -100
  156. data/spec/lib/metasploit/model/reference_spec.rb +0 -21
  157. data/spec/support/shared/contexts/metasploit/model/module/ancestor/contents/metasploit_module.rb +0 -12
  158. data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents.rb +0 -10
  159. data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents/metasploit_module.rb +0 -15
  160. data/spec/support/shared/examples/derives.rb +0 -115
  161. data/spec/support/shared/examples/metasploit/model/architecture.rb +0 -425
  162. data/spec/support/shared/examples/metasploit/model/architecture/seed.rb +0 -25
  163. data/spec/support/shared/examples/metasploit/model/author.rb +0 -27
  164. data/spec/support/shared/examples/metasploit/model/authority.rb +0 -124
  165. data/spec/support/shared/examples/metasploit/model/authority/seed.rb +0 -49
  166. data/spec/support/shared/examples/metasploit/model/email_address.rb +0 -220
  167. data/spec/support/shared/examples/metasploit/model/module/action.rb +0 -26
  168. data/spec/support/shared/examples/metasploit/model/module/ancestor.rb +0 -2004
  169. data/spec/support/shared/examples/metasploit/model/module/ancestor/payload_factory.rb +0 -63
  170. data/spec/support/shared/examples/metasploit/model/module/architecture.rb +0 -36
  171. data/spec/support/shared/examples/metasploit/model/module/author.rb +0 -29
  172. data/spec/support/shared/examples/metasploit/model/module/class.rb +0 -1514
  173. data/spec/support/shared/examples/metasploit/model/module/handler.rb +0 -21
  174. data/spec/support/shared/examples/metasploit/model/module/instance.rb +0 -1384
  175. data/spec/support/shared/examples/metasploit/model/module/instance/class_methods.rb +0 -537
  176. data/spec/support/shared/examples/metasploit/model/module/instance/is_not_stanced_with_module_type.rb +0 -22
  177. data/spec/support/shared/examples/metasploit/model/module/instance/is_stanced_with_module_type.rb +0 -38
  178. data/spec/support/shared/examples/metasploit/model/module/instance/validates/dynamic_length_of.rb +0 -131
  179. data/spec/support/shared/examples/metasploit/model/module/path.rb +0 -493
  180. data/spec/support/shared/examples/metasploit/model/module/platform.rb +0 -36
  181. data/spec/support/shared/examples/metasploit/model/module/rank.rb +0 -92
  182. data/spec/support/shared/examples/metasploit/model/module/reference.rb +0 -16
  183. data/spec/support/shared/examples/metasploit/model/module/target.rb +0 -29
  184. data/spec/support/shared/examples/metasploit/model/module/target/architecture.rb +0 -56
  185. data/spec/support/shared/examples/metasploit/model/module/target/platform.rb +0 -56
  186. data/spec/support/shared/examples/metasploit/model/platform.rb +0 -213
  187. data/spec/support/shared/examples/metasploit/model/real_pathname.rb +0 -29
  188. data/spec/support/shared/examples/metasploit/model/reference.rb +0 -410
  189. data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/app.rb +0 -44
  190. data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/authority.rb +0 -72
  191. data/spec/support/templates/metasploit/model/module/ancestors/_attributes.rb.erb +0 -9
  192. data/spec/support/templates/metasploit/model/module/ancestors/_methods.rb.erb +0 -8
  193. data/spec/support/templates/metasploit/model/module/ancestors/_validations.rb.erb +0 -6
  194. data/spec/support/templates/metasploit/model/module/ancestors/base.rb.erb +0 -3
  195. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_auxiliary.rb.erb +0 -1
  196. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_encoder.rb.erb +0 -1
  197. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_exploit.rb.erb +0 -1
  198. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_non_payload.rb.erb +0 -5
  199. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_nop.rb.erb +0 -1
  200. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_payload.rb.erb +0 -4
  201. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_post.rb.erb +0 -1
  202. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_handled.rb.erb +0 -20
  203. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_single.rb.erb +0 -1
  204. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stage.rb.erb +0 -0
  205. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stager.rb.erb +0 -1
  206. 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