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,124 +0,0 @@
1
- Metasploit::Model::Spec.shared_examples_for 'Authority' do
2
- full_authority_factory = "full_#{authority_factory}"
3
- obsolete_authority_factory = "obsolete_#{authority_factory}"
4
-
5
- context 'factories' do
6
- context authority_factory do
7
- subject(authority_factory) do
8
- FactoryGirl.build(authority_factory)
9
- end
10
-
11
- it { should be_valid }
12
- end
13
-
14
- context full_authority_factory do
15
- subject(full_authority_factory) do
16
- FactoryGirl.build(full_authority_factory)
17
- end
18
-
19
- it { should be_valid }
20
-
21
- its(:summary) { should_not be_nil }
22
- its(:url) { should_not be_nil }
23
- end
24
-
25
- context obsolete_authority_factory do
26
- subject(obsolete_authority_factory) do
27
- FactoryGirl.build(obsolete_authority_factory)
28
- end
29
-
30
- it { should be_valid }
31
-
32
- its(:obsolete) { should be_true }
33
- end
34
- end
35
-
36
- context 'mass assignment security' do
37
- it { should allow_mass_assignment_of(:abbreviation) }
38
- it { should allow_mass_assignment_of(:obsolete) }
39
- it { should allow_mass_assignment_of(:summary) }
40
- it { should allow_mass_assignment_of(:url) }
41
- end
42
-
43
- context 'search' do
44
- context 'attributes' do
45
- it_should_behave_like 'search_attribute', :abbreviation, :type => :string
46
- end
47
- end
48
-
49
- context 'seeds' do
50
- it_should_behave_like 'Metasploit::Model::Authority seed',
51
- :abbreviation => 'BID',
52
- :extension_name => 'Metasploit::Model::Authority::Bid',
53
- :obsolete => false,
54
- :summary => 'BuqTraq ID',
55
- :url => 'http://www.securityfocus.com/bid'
56
-
57
- it_should_behave_like 'Metasploit::Model::Authority seed',
58
- :abbreviation => 'CVE',
59
- :extension_name => 'Metasploit::Model::Authority::Cve',
60
- :obsolete => false,
61
- :summary => 'Common Vulnerabilities and Exposures',
62
- :url => 'http://cvedetails.com'
63
-
64
- it_should_behave_like 'Metasploit::Model::Authority seed',
65
- :abbreviation => 'MIL',
66
- :extension_name => nil,
67
- :obsolete => true,
68
- :summary => 'milw0rm',
69
- :url => 'https://en.wikipedia.org/wiki/Milw0rm'
70
-
71
- it_should_behave_like 'Metasploit::Model::Authority seed',
72
- :abbreviation => 'MSB',
73
- :extension_name => 'Metasploit::Model::Authority::Msb',
74
- :obsolete => false,
75
- :summary => 'Microsoft Security Bulletin',
76
- :url => 'http://www.microsoft.com/technet/security/bulletin'
77
-
78
- it_should_behave_like 'Metasploit::Model::Authority seed',
79
- :abbreviation => 'OSVDB',
80
- :extension_name => 'Metasploit::Model::Authority::Osvdb',
81
- :obsolete => false,
82
- :summary => 'Open Sourced Vulnerability Database',
83
- :url => 'http://osvdb.org'
84
-
85
- it_should_behave_like 'Metasploit::Model::Authority seed',
86
- :abbreviation => 'PMASA',
87
- :extension_name => 'Metasploit::Model::Authority::Pmasa',
88
- :obsolete => false,
89
- :summary => 'phpMyAdmin Security Announcement',
90
- :url => 'http://www.phpmyadmin.net/home_page/security/'
91
-
92
- it_should_behave_like 'Metasploit::Model::Authority seed',
93
- :abbreviation => 'SECUNIA',
94
- :extension_name => 'Metasploit::Model::Authority::Secunia',
95
- :obsolete => false,
96
- :summary => 'Secunia',
97
- :url => 'https://secunia.com/advisories'
98
-
99
- it_should_behave_like 'Metasploit::Model::Authority seed',
100
- :abbreviation => 'US-CERT-VU',
101
- :extension_name => 'Metasploit::Model::Authority::UsCertVu',
102
- :obsolete => false,
103
- :summary => 'United States Computer Emergency Readiness Team Vulnerability Notes Database',
104
- :url => 'http://www.kb.cert.org/vuls'
105
-
106
- it_should_behave_like 'Metasploit::Model::Authority seed',
107
- :abbreviation => 'waraxe',
108
- :extension_name => 'Metasploit::Model::Authority::Waraxe',
109
- :obsolete => false,
110
- :summary => 'Waraxe Advisories',
111
- :url => 'http://www.waraxe.us/content-cat-1.html'
112
-
113
- it_should_behave_like 'Metasploit::Model::Authority seed',
114
- abbreviation: 'ZDI',
115
- extension_name: 'Metasploit::Model::Authority::Zdi',
116
- obsolete: false,
117
- summary: 'Zero Day Initiative',
118
- url: 'http://www.zerodayinitiative.com/advisories'
119
- end
120
-
121
- context 'validations' do
122
- it { should validate_presence_of(:abbreviation) }
123
- end
124
- end
@@ -1,49 +0,0 @@
1
- shared_examples_for 'Metasploit::Model::Authority seed' do |attributes={}|
2
- attributes.assert_valid_keys(:abbreviation, :extension_name, :obsolete, :summary, :url)
3
-
4
- abbreviation = attributes.fetch(:abbreviation)
5
-
6
- context "with #{abbreviation}" do
7
- subject(:seed) do
8
- seed_with_abbreviation(abbreviation)
9
- end
10
-
11
- it 'should exist' do
12
- seed.should_not be_nil
13
- end
14
-
15
- its(:obsolete) { should == attributes.fetch(:obsolete) }
16
- its(:summary) { should == attributes.fetch(:summary) }
17
- its(:url) { should == attributes.fetch(:url) }
18
-
19
- extension_name = attributes.fetch(:extension_name)
20
-
21
- if extension_name
22
- context 'with extension' do
23
- let(:designation) do
24
- double('Designation')
25
- end
26
-
27
- let(:extension) do
28
- extension_name.constantize
29
- end
30
-
31
- its(:extension) { should == extension }
32
-
33
- it 'should have extension be a defined class' do
34
- expect {
35
- extension
36
- }.to_not raise_error
37
- end
38
-
39
- it 'should delegate #designation_url to extension' do
40
- extension.should_receive(:designation_url).with(designation)
41
-
42
- seed.designation_url(designation)
43
- end
44
- end
45
- else
46
- its(:extension) { should be_nil }
47
- end
48
- end
49
- end
@@ -1,220 +0,0 @@
1
- Metasploit::Model::Spec.shared_examples_for 'EmailAddress' do
2
- context 'derivations' do
3
- context 'with #full derived' do
4
- before(:each) do
5
- email_address.full = email_address.derived_full
6
- end
7
-
8
- it_should_behave_like 'derives', :domain, :validates => true
9
- it_should_behave_like 'derives', :local, :validates => true
10
- end
11
-
12
- it_should_behave_like 'derives', :full, :validates => true
13
- end
14
-
15
- context 'factories' do
16
- context email_address_factory do
17
- subject(email_address_factory) do
18
- FactoryGirl.build(email_address_factory)
19
- end
20
-
21
- it { should be_valid }
22
- end
23
- end
24
-
25
- context 'mass assignment security' do
26
- it { should allow_mass_assignment_of(:domain) }
27
- it { should allow_mass_assignment_of(:full) }
28
- it { should allow_mass_assignment_of(:local) }
29
- end
30
-
31
- context 'search' do
32
- context 'attributes' do
33
- it_should_behave_like 'search_attribute', :domain, :type => :string
34
- it_should_behave_like 'search_attribute', :full, :type => :string
35
- it_should_behave_like 'search_attribute', :local, :type => :string
36
- end
37
- end
38
-
39
- context 'validations' do
40
- it { should validate_presence_of :domain }
41
- it { should validate_presence_of :local }
42
- end
43
-
44
- context '#derived_domain' do
45
- subject(:derived_domain) do
46
- email_address.derived_domain
47
- end
48
-
49
- before(:each) do
50
- email_address.full = full
51
- end
52
-
53
- context 'with #full' do
54
- let(:domain) do
55
- FactoryGirl.generate :metasploit_model_email_address_domain
56
- end
57
-
58
- let(:local) do
59
- FactoryGirl.generate :metasploit_model_email_address_local
60
- end
61
-
62
- context "with '@'" do
63
- let(:full) do
64
- "#{local}@#{domain}"
65
- end
66
-
67
-
68
- context 'with local before @' do
69
- it "should be portion after '@'" do
70
- derived_domain.should == domain
71
- end
72
- end
73
-
74
- context 'without local before @' do
75
- let(:local) do
76
- ''
77
- end
78
-
79
- it "should be portion after '@'" do
80
- derived_domain.should == domain
81
- end
82
- end
83
- end
84
-
85
- context "without '@'" do
86
- let(:full) do
87
- local
88
- end
89
-
90
- it { should be_nil }
91
- end
92
- end
93
-
94
- context 'without #full' do
95
- let(:full) do
96
- ''
97
- end
98
-
99
- it { should be_nil }
100
- end
101
- end
102
-
103
- context '#derived_full' do
104
- subject(:derived_full) do
105
- email_address.derived_full
106
- end
107
-
108
- before(:each) do
109
- email_address.domain = domain
110
- email_address.local = local
111
- end
112
-
113
- context 'with domain' do
114
- let(:domain) do
115
- FactoryGirl.generate :metasploit_model_email_address_domain
116
- end
117
-
118
- context 'with #local' do
119
- let(:local) do
120
- FactoryGirl.generate :metasploit_model_email_address_local
121
- end
122
-
123
- it 'should <local>@<domain>' do
124
- derived_full.should == "#{local}@#{domain}"
125
- end
126
- end
127
-
128
- context 'without #local' do
129
- let(:local) do
130
- ''
131
- end
132
-
133
- it { should be_nil }
134
- end
135
- end
136
-
137
- context 'without #domain' do
138
- let(:domain) do
139
- ''
140
- end
141
-
142
- context 'with #local' do
143
- let(:local) do
144
- FactoryGirl.generate :metasploit_model_email_address_local
145
- end
146
-
147
- it { should be_nil }
148
- end
149
-
150
- context 'without #local' do
151
- let(:local) do
152
- ''
153
- end
154
-
155
- it { should be_nil }
156
- end
157
- end
158
- end
159
-
160
- context '#derived_local' do
161
- subject(:derived_local) do
162
- email_address.derived_local
163
- end
164
-
165
- before(:each) do
166
- email_address.full = full
167
- end
168
-
169
- context 'with #full' do
170
- let(:domain) do
171
- FactoryGirl.generate :metasploit_model_email_address_domain
172
- end
173
-
174
- let(:local) do
175
- FactoryGirl.generate :metasploit_model_email_address_local
176
- end
177
-
178
- context "with '@'" do
179
- let(:full) do
180
- "#{local}@#{domain}"
181
- end
182
-
183
-
184
- context "with domain after '@'" do
185
- it "should be portion before '@'" do
186
- derived_local.should == local
187
- end
188
- end
189
-
190
- context "without domain after '@'" do
191
- let(:local) do
192
- ''
193
- end
194
-
195
- it "should be portion before '@'" do
196
- derived_local.should == local
197
- end
198
- end
199
- end
200
-
201
- context "without '@'" do
202
- let(:full) do
203
- local
204
- end
205
-
206
- it 'should be entirety of #full' do
207
- derived_local.should == full
208
- end
209
- end
210
- end
211
-
212
- context 'without #full' do
213
- let(:full) do
214
- ''
215
- end
216
-
217
- it { should be_nil }
218
- end
219
- end
220
- end
@@ -1,26 +0,0 @@
1
- Metasploit::Model::Spec.shared_examples_for 'Module::Action' do
2
- context 'factories' do
3
- context module_action_factory do
4
- let(module_action_factory) do
5
- FactoryGirl.build(module_action_factory)
6
- end
7
-
8
- it { should be_valid }
9
- end
10
- end
11
-
12
- context 'mass assignment security' do
13
- it { should allow_mass_assignment_of(:name) }
14
- end
15
-
16
- context 'search' do
17
- context 'attributes' do
18
- it_should_behave_like 'search_attribute', :name, :type => :string
19
- end
20
- end
21
-
22
- context 'validations' do
23
- it { should validate_presence_of(:module_instance) }
24
- it { should validate_presence_of(:name) }
25
- end
26
- end
@@ -1,2004 +0,0 @@
1
- Metasploit::Model::Spec.shared_examples_for 'Module::Ancestor' do
2
- #
3
- # Module::Ancestor factories
4
- #
5
-
6
- payload_module_ancestor_factory = "payload_#{module_ancestor_factory}".to_sym
7
- single_payload_module_ancestor_factory = "single_#{payload_module_ancestor_factory}".to_sym
8
- stage_payload_module_ancestor_factory = "stage_#{payload_module_ancestor_factory}".to_sym
9
- stager_payload_module_ancestor_factory = "stager_#{payload_module_ancestor_factory}".to_sym
10
-
11
- #
12
- # Module::Path factories
13
- #
14
-
15
- module_path_factory = "#{factory_namespace}_module_path".to_sym
16
-
17
- it_should_behave_like 'Metasploit::Model::RealPathname' do
18
- let(:base_instance) do
19
- FactoryGirl.build(module_ancestor_factory)
20
- end
21
- end
22
-
23
- context 'CONSTANTS' do
24
- context 'DIRECTORY_BY_MODULE_TYPE' do
25
- subject(:directory_by_module_type) do
26
- described_class::DIRECTORY_BY_MODULE_TYPE
27
- end
28
-
29
- its(['auxiliary']) { should == 'auxiliary' }
30
- its(['encoder']) { should == 'encoders' }
31
- its(['exploit']) { should == 'exploits' }
32
- its(['nop']) { should == 'nops' }
33
- its(['payload']) { should == 'payloads' }
34
- its(['post']) { should == 'post' }
35
-
36
- it 'should have same module types as Metasploit::Model::Module::Type::ALL' do
37
- directory_by_module_type.keys.should =~ Metasploit::Model::Module::Type::ALL
38
- end
39
- end
40
-
41
- context 'EXTENSION' do
42
- subject(:extension) do
43
- described_class::EXTENSION
44
- end
45
-
46
- it 'should be ruby source extension' do
47
- extension.should == '.rb'
48
- end
49
-
50
- it "should start with '.'" do
51
- extension.should start_with('.')
52
- end
53
- end
54
-
55
- context 'HANDLED_TYPES' do
56
- subject(:handled_types) do
57
- described_class::HANDLED_TYPES
58
- end
59
-
60
- it { should include('single') }
61
- it { should_not include('stage') }
62
- it { should include('stager') }
63
-
64
- it 'should be a subset of PAYLOAD_TYPES' do
65
- handled_type_set = Set.new(handled_types)
66
- payload_type_set = Set.new(described_class::PAYLOAD_TYPES)
67
-
68
- handled_type_set.should be_a_subset(payload_type_set)
69
- end
70
- end
71
-
72
- context 'MODULE_TYPE_BY_DIRECTORY' do
73
- subject(:module_type_by_directory) do
74
- described_class::MODULE_TYPE_BY_DIRECTORY
75
- end
76
-
77
- its(['auxiliary']) { should == 'auxiliary' }
78
- its(['encoders']) { should == 'encoder' }
79
- its(['exploits']) { should == 'exploit' }
80
- its(['nops']) { should == 'nop' }
81
- its(['payloads']) { should == 'payload' }
82
- its(['post']) { should == 'post' }
83
-
84
- it 'should have same module types as Metasploit::Model::Module::Type::ALL' do
85
- module_type_by_directory.values.should =~ Metasploit::Model::Module::Type::ALL
86
- end
87
- end
88
-
89
- context 'PAYLOAD_TYPES' do
90
- subject(:payload_types) do
91
- described_class::PAYLOAD_TYPES
92
- end
93
-
94
- it { should include('single') }
95
- it { should include('stage') }
96
- it { should include('stager') }
97
- end
98
-
99
- # pattern is tested in validation tests below
100
- it 'should define REFERENCE_NAME_REGEXP' do
101
- described_class::REFERENCE_NAME_REGEXP.should be_a Regexp
102
- end
103
-
104
- context 'REFERENCE_NAME_SEPARATOR' do
105
- subject(:reference_name_separator) do
106
- described_class::REFERENCE_NAME_SEPARATOR
107
- end
108
-
109
- it { should == '/' }
110
- end
111
-
112
- # pattern is tested in validation tests below
113
- it 'should define SHA_HEX_DIGEST_REGEXP' do
114
- described_class::SHA1_HEX_DIGEST_REGEXP.should be_a Regexp
115
- end
116
- end
117
-
118
- context 'derivation' do
119
- def attribute_type(attribute)
120
- type_by_attribute = {
121
- :full_name => :text,
122
- :module_type => :string,
123
- :payload_type => :string,
124
- :real_path => :text,
125
- :real_path_modified_at => :datetime,
126
- :real_path_sha1_hex_digest => :string,
127
- :reference_name => :text
128
- }
129
-
130
- type_by_attribute.fetch(attribute)
131
- end
132
-
133
- it_should_behave_like 'derives', :full_name, :validates => true
134
- it_should_behave_like 'derives', :real_path, :validates => true
135
-
136
- context 'with only module_path and real_path' do
137
- subject(:module_ancestor) do
138
- # make sure real_path is derived
139
- real_path_creator.should be_valid
140
-
141
- module_ancestor = module_ancestor_class.new
142
-
143
- # work-around mass-assignment security
144
- module_ancestor.parent_path = real_path_creator.parent_path
145
- module_ancestor.real_path = real_path_creator.real_path
146
-
147
- module_ancestor
148
- end
149
-
150
- before(:each) do
151
- # run before validation callbacks to trigger derivations
152
- module_ancestor.valid?
153
- end
154
-
155
- context 'with payload' do
156
- let(:real_path_creator) do
157
- FactoryGirl.build(
158
- module_ancestor_factory,
159
- module_type: 'payload',
160
- payload_type: payload_type
161
- )
162
- end
163
-
164
- context 'with single' do
165
- let(:payload_type) do
166
- 'single'
167
- end
168
-
169
- it 'should be handled' do
170
- module_ancestor.should be_handled
171
- end
172
-
173
- it { should_not be_valid }
174
-
175
- it 'should be valid for loading' do
176
- module_ancestor.valid?(:loading)
177
- end
178
- end
179
-
180
- context 'with stage' do
181
- let(:payload_type) do
182
- 'stage'
183
- end
184
-
185
- it 'should not be handled' do
186
- module_ancestor.should_not be_handled
187
- end
188
-
189
- it { should be_valid }
190
-
191
- it 'should be valid for loading' do
192
- module_ancestor.valid?(:loading)
193
- end
194
- end
195
-
196
- context 'with stager' do
197
- let(:payload_type) do
198
- 'stager'
199
- end
200
-
201
- it 'should be handled' do
202
- module_ancestor.should be_handled
203
- end
204
-
205
- it { should_not be_valid }
206
-
207
- it 'should be valid for loading' do
208
- module_ancestor.valid?(:loading)
209
- end
210
- end
211
- end
212
-
213
- context 'without payload' do
214
- let(:real_path_creator) do
215
- FactoryGirl.build(
216
- module_ancestor_factory,
217
- module_type: module_type
218
- )
219
- end
220
-
221
- let(:module_type) do
222
- FactoryGirl.generate :metasploit_model_non_payload_module_type
223
- end
224
-
225
- it 'should not be handled' do
226
- module_ancestor.should_not be_handled
227
- end
228
-
229
- it { should be_valid }
230
-
231
- it 'should be valid for loading' do
232
- module_ancestor.valid?(:loading)
233
- end
234
- end
235
- end
236
-
237
- context 'with payload' do
238
- subject(:module_ancestor) do
239
- FactoryGirl.build(
240
- module_ancestor_factory,
241
- # {Mdm::Module::Ancestor#derived_payload_type} will be `nil` unless {Mdm::Module::Ancestor#module_type} is
242
- # `'payload'`
243
- :module_type => 'payload',
244
- # Ensure {Mdm::Module::Ancestor#derived_payload} will be a valid {Mdm::Module::Ancestor#payload_type}.
245
- :reference_name => reference_name
246
- )
247
- end
248
-
249
- let(:reference_name) do
250
- FactoryGirl.generate :metasploit_model_module_ancestor_payload_reference_name
251
- end
252
-
253
- it_should_behave_like 'derives', :payload_type, :validates => true
254
- end
255
-
256
- context 'with real_path' do
257
- before(:each) do
258
- # {Metasploit::Model::Module::Ancestor#derived_real_path_modified_at} and
259
- # {Metasploit::Model::Module::Ancestor#derived_real_path_sha1_hex_digest} both depend on real_path being
260
- # populated or they will return nil, so need set real_path = derived_real_path before testing as would happen
261
- # with the normal order of before validation callbacks.
262
- module_ancestor.real_path = module_ancestor.derived_real_path
263
-
264
- # blank out {Metasploit::Model::Module::Ancestor#module_type} and
265
- # {Metasploit::Model::Module::Ancestor#reference_name} so they will be rederived from
266
- # {Metasploit::Model::Module::Ancestor#real_path} to simulate module cache construction usage.
267
- module_ancestor.module_type = nil
268
- module_ancestor.reference_name = nil
269
- end
270
-
271
- it_should_behave_like 'derives', :module_type, :validates => false
272
- it_should_behave_like 'derives', :real_path_modified_at, :validates => false
273
- it_should_behave_like 'derives', :real_path_sha1_hex_digest, :validates => false
274
- it_should_behave_like 'derives', :reference_name, :validates => false
275
- end
276
- end
277
-
278
- context 'factories' do
279
- context module_ancestor_factory.to_s do
280
- subject(module_ancestor_factory) do
281
- FactoryGirl.build(module_ancestor_factory)
282
- end
283
-
284
- it { should be_valid }
285
-
286
- context 'contents' do
287
- include_context 'Metasploit::Model::Module::Ancestor factory contents'
288
-
289
- let(:module_ancestor) do
290
- send(module_ancestor_factory)
291
- end
292
-
293
- context 'metasploit_module' do
294
- include_context 'Metasploit::Model::Module::Ancestor factory contents metasploit_module'
295
-
296
- # Classes are Modules, so this checks that it is either a Class or a Module.
297
- it { should be_a Module }
298
-
299
- context '#module_type' do
300
- let(:module_ancestor) do
301
- FactoryGirl.build(
302
- module_ancestor_factory,
303
- module_type: module_type
304
- )
305
- end
306
-
307
- context 'with payload' do
308
- let(:module_type) do
309
- Metasploit::Model::Module::Type::PAYLOAD
310
- end
311
-
312
- it { should_not be_a Class }
313
-
314
- it 'should define #initalize that takes an option hash' do
315
- begin
316
- unbound_method = metasploit_module.instance_method(:initialize)
317
- rescue NameError
318
- unbound_method = nil
319
- end
320
-
321
- unbound_method.should_not be_nil
322
- unbound_method.should have(1).parameters
323
- unbound_method.parameters[0][0].should == :opt
324
- end
325
- end
326
-
327
- context 'without payload' do
328
- let(:module_type) do
329
- FactoryGirl.generate :metasploit_model_non_payload_module_type
330
- end
331
-
332
- it { should be_a Class }
333
-
334
- context '#initialize' do
335
- subject(:instance) do
336
- metasploit_module.new(attributes)
337
- end
338
-
339
- context 'with :framework' do
340
- let(:attributes) do
341
- {
342
- framework: framework
343
- }
344
- end
345
-
346
- let(:framework) do
347
- double('Msf::Framework')
348
- end
349
-
350
- it 'should set #framework' do
351
- instance.framework.should == framework
352
- end
353
- end
354
- end
355
- end
356
- end
357
- end
358
- end
359
- end
360
-
361
- context payload_module_ancestor_factory.to_s do
362
- subject(payload_module_ancestor_factory) do
363
- FactoryGirl.build(payload_module_ancestor_factory)
364
- end
365
-
366
- it { should be_valid }
367
-
368
- its(:derived_payload_type) { should_not be_nil }
369
-
370
- it_should_behave_like 'Metasploit::Model::Module::Ancestor payload factory' do
371
- let(:module_ancestor) do
372
- send(payload_module_ancestor_factory)
373
- end
374
- end
375
- end
376
-
377
- context single_payload_module_ancestor_factory.to_s do
378
- subject(single_payload_module_ancestor_factory) do
379
- FactoryGirl.build(single_payload_module_ancestor_factory)
380
- end
381
-
382
- it { should be_valid }
383
-
384
- its(:derived_payload_type) { should == 'single' }
385
-
386
- it_should_behave_like 'Metasploit::Model::Module::Ancestor payload factory', handler_type: true do
387
- let(:module_ancestor) do
388
- send(single_payload_module_ancestor_factory)
389
- end
390
- end
391
- end
392
-
393
- context stage_payload_module_ancestor_factory.to_s do
394
- subject(stage_payload_module_ancestor_factory) do
395
- FactoryGirl.build(stage_payload_module_ancestor_factory)
396
- end
397
-
398
- it { should be_valid }
399
-
400
- its(:derived_payload_type) { should == 'stage' }
401
-
402
- it_should_behave_like 'Metasploit::Model::Module::Ancestor payload factory', handler_type: false do
403
- let(:module_ancestor) do
404
- send(stage_payload_module_ancestor_factory)
405
- end
406
- end
407
- end
408
-
409
- context 'stager_payload_module_ancestor_factory' do
410
- subject(stager_payload_module_ancestor_factory) do
411
- FactoryGirl.build(stager_payload_module_ancestor_factory)
412
- end
413
-
414
- it { should be_valid }
415
-
416
- its(:derived_payload_type) { should == 'stager' }
417
-
418
- it_should_behave_like 'Metasploit::Model::Module::Ancestor payload factory', handler_type: true do
419
- let(:module_ancestor) do
420
- send(stager_payload_module_ancestor_factory)
421
- end
422
- end
423
- end
424
- end
425
-
426
- context 'mass assignment security' do
427
- it 'should not allow mass assignment of full_name since it must match derived_full_name' do
428
- module_ancestor.should_not allow_mass_assignment_of(:full_name)
429
- end
430
-
431
- it { should allow_mass_assignment_of(:handler_type) }
432
- it { should allow_mass_assignment_of(:module_type) }
433
-
434
- it 'should not allow mass assignment of payload_type since it must match derived_payload_type' do
435
- module_ancestor.should_not allow_mass_assignment_of(:payload_type)
436
- end
437
-
438
- it 'should allow mass assignment of real_path to allow derivation of module_type and reference_name' do
439
- module_ancestor.should allow_mass_assignment_of(:real_path)
440
- end
441
-
442
- it 'should not allow mass assignment of real_path_modified_at since it is derived' do
443
- module_ancestor.should_not allow_mass_assignment_of(:real_path_modified_at)
444
- end
445
-
446
- it 'should not allow mass assignment of real_path_sha1_hex_digest since it is derived' do
447
- module_ancestor.should_not allow_mass_assignment_of(:real_path_sha1_hex_digest)
448
- end
449
-
450
- it { should_not allow_mass_assignment_of(:parent_path_id) }
451
- end
452
-
453
- context 'validations' do
454
- subject(:module_ancestor) do
455
- # Don't use factory so that nil values can be tested without the nil being replaced with derived value
456
- module_ancestor_class.new
457
- end
458
-
459
- context 'handler_type' do
460
- subject(:module_ancestor) do
461
- FactoryGirl.build(
462
- module_ancestor_factory,
463
- :handler_type => handler_type,
464
- :module_type => module_type,
465
- :payload_type => payload_type
466
- )
467
- end
468
-
469
- context 'with payload' do
470
- let(:module_type) do
471
- 'payload'
472
- end
473
-
474
- context 'with payload_type' do
475
- context 'single' do
476
- let(:payload_type) do
477
- 'single'
478
- end
479
-
480
- context 'with handler_type' do
481
- let(:handler_type) do
482
- FactoryGirl.generate :metasploit_model_module_handler_type
483
- end
484
-
485
- it { should be_valid }
486
- end
487
-
488
- context 'without handler_type' do
489
- let(:handler_type) do
490
- nil
491
- end
492
-
493
- context 'with :loading validation_context' do
494
- let(:validation_context) do
495
- :loading
496
- end
497
-
498
- it 'should be valid' do
499
- module_ancestor.valid?(validation_context).should be_true
500
- end
501
- end
502
-
503
- context 'without validation_context' do
504
- it { should_not be_valid }
505
-
506
- it 'should record error on handler_type' do
507
- module_ancestor.valid?
508
-
509
- module_ancestor.errors[:handler_type].should include(I18n.translate!('errors.messages.blank'))
510
- end
511
- end
512
- end
513
- end
514
-
515
- context 'stage' do
516
- let(:payload_type) do
517
- 'stage'
518
- end
519
-
520
- context 'with handler_type' do
521
- let(:handler_type) do
522
- FactoryGirl.generate :metasploit_model_module_handler_type
523
- end
524
-
525
- it { should_not be_valid }
526
-
527
- it 'should record error on handler_type' do
528
- module_ancestor.valid?
529
-
530
- module_ancestor.errors[:handler_type].should include('must be nil')
531
- end
532
- end
533
-
534
- context 'without handler_type' do
535
- let(:handler_type) do
536
- nil
537
- end
538
-
539
- it { should be_valid }
540
- end
541
- end
542
-
543
- context 'stager' do
544
- let(:payload_type) do
545
- 'stager'
546
- end
547
-
548
- context 'with handler_type' do
549
- let(:handler_type) do
550
- FactoryGirl.generate :metasploit_model_module_handler_type
551
- end
552
-
553
- it { should be_valid }
554
- end
555
-
556
- context 'without handler_type' do
557
- let(:handler_type) do
558
- nil
559
- end
560
-
561
- it { should_not be_valid }
562
-
563
- it 'should record error on handler_type' do
564
- module_ancestor.valid?
565
-
566
- module_ancestor.errors[:handler_type].should include(I18n.translate!('errors.messages.blank'))
567
- end
568
- end
569
- end
570
- end
571
- end
572
-
573
- context 'without payload' do
574
- let(:module_type) do
575
- FactoryGirl.generate :metasploit_model_non_payload_module_type
576
- end
577
-
578
- context 'with payload_type' do
579
- # force payload_type to NOT be derived to check invalid setups
580
- before(:each) do
581
- module_ancestor.payload_type = payload_type
582
- end
583
-
584
- context 'single' do
585
- let(:payload_type) do
586
- 'single'
587
- end
588
-
589
- context 'with handler_type' do
590
- let(:handler_type) do
591
- FactoryGirl.generate :metasploit_model_module_handler_type
592
- end
593
-
594
- it { should be_invalid }
595
-
596
- it 'should record error on handler_type' do
597
- module_ancestor.valid?
598
-
599
- module_ancestor.errors[:handler_type].should include('must be nil')
600
- end
601
- end
602
-
603
- context 'without handler_type' do
604
- let(:handler_type) do
605
- nil
606
- end
607
-
608
- it 'should not record error on handler_type' do
609
- module_ancestor.valid?
610
-
611
- module_ancestor.errors[:handler_type].should be_empty
612
- end
613
- end
614
- end
615
-
616
- context 'stage' do
617
- let(:payload_type) do
618
- 'stage'
619
- end
620
-
621
- context 'with handler_type' do
622
- let(:handler_type) do
623
- FactoryGirl.generate :metasploit_model_module_handler_type
624
- end
625
-
626
- it { should_not be_valid }
627
-
628
- it 'should record error on handler_type' do
629
- module_ancestor.valid?
630
-
631
- module_ancestor.errors[:handler_type].should include('must be nil')
632
- end
633
- end
634
-
635
- context 'without handler_type' do
636
- let(:handler_type) do
637
- nil
638
- end
639
-
640
- it 'should not record error on handler_type' do
641
- module_ancestor.valid?
642
-
643
- module_ancestor.errors[:handler_type].should be_empty
644
- end
645
- end
646
- end
647
-
648
- context 'stager' do
649
- let(:payload_type) do
650
- 'stager'
651
- end
652
-
653
- context 'with handler_type' do
654
- let(:handler_type) do
655
- FactoryGirl.generate :metasploit_model_module_handler_type
656
- end
657
-
658
- it { should_not be_valid }
659
-
660
- it 'should record error on handler_type' do
661
- module_ancestor.valid?
662
-
663
- module_ancestor.errors[:handler_type].should include('must be nil')
664
- end
665
- end
666
-
667
- context 'without handler_type' do
668
- let(:handler_type) do
669
- nil
670
- end
671
-
672
- it 'should not record error on handler_type' do
673
- module_ancestor.valid?
674
-
675
- module_ancestor.errors[:handler_type].should be_empty
676
- end
677
- end
678
- end
679
- end
680
-
681
- context 'without payload_type' do
682
- let(:payload_type) do
683
- nil
684
- end
685
-
686
- context 'with handler_type' do
687
- let(:handler_type) do
688
- FactoryGirl.generate :metasploit_model_module_handler_type
689
- end
690
-
691
- it { should_not be_valid }
692
-
693
- it 'should record error on handler_type' do
694
- module_ancestor.valid?
695
-
696
- module_ancestor.errors[:handler_type].should include('must be nil')
697
- end
698
- end
699
-
700
- context 'without handler_type' do
701
- let(:handler_type) do
702
- nil
703
- end
704
-
705
- it { should be_valid }
706
- end
707
- end
708
- end
709
- end
710
-
711
- it { should ensure_inclusion_of(:module_type).in_array(Metasploit::Model::Module::Type::ALL) }
712
- it { should validate_presence_of(:parent_path) }
713
-
714
- context 'payload_type' do
715
- subject(:module_ancestor) do
716
- FactoryGirl.build(
717
- module_ancestor_factory,
718
- :module_type => module_type,
719
- :reference_name => reference_name
720
- )
721
- end
722
-
723
- before(:each) do
724
- # payload is ignored in metasploit_model_module_ancestor trait so need set it directly
725
- module_ancestor.payload_type = payload_type
726
- end
727
-
728
- context 'with payload?' do
729
- let(:module_type) do
730
- 'payload'
731
- end
732
-
733
- context 'with payload_type' do
734
- Metasploit::Model::Module::Ancestor::PAYLOAD_TYPES.each do |allowed_payload_type|
735
- context "with #{allowed_payload_type}" do
736
- let(:payload_type) do
737
- nil
738
- end
739
-
740
- let(:payload_type_directory) do
741
- allowed_payload_type.pluralize
742
- end
743
-
744
- let(:reference_name) do
745
- "#{payload_type_directory}/name"
746
- end
747
-
748
- it { should be_valid }
749
- end
750
- end
751
- end
752
-
753
- context 'without payload_type' do
754
- let(:payload_type) do
755
- nil
756
- end
757
-
758
- let(:reference_name) do
759
- FactoryGirl.generate :metasploit_model_module_ancestor_non_payload_reference_name
760
- end
761
-
762
- it { should_not be_valid }
763
-
764
- it 'should record error on payload_type' do
765
- module_ancestor.valid?
766
-
767
- module_ancestor.errors[:payload_type].should include('is not included in the list')
768
- end
769
- end
770
- end
771
-
772
- context 'without payload?' do
773
- let(:module_type) do
774
- FactoryGirl.generate :metasploit_model_non_payload_module_type
775
- end
776
-
777
- context 'with payload_type' do
778
- # force payload to not be nil so that derive_payload_type is not called.
779
- let(:payload_type) do
780
- FactoryGirl.generate :metasploit_model_module_ancestor_payload_type
781
- end
782
-
783
- let(:reference_name) do
784
- "#{payload_type.pluralize}/name"
785
- end
786
-
787
- it { should_not be_valid }
788
-
789
- it 'should record error on payload_type' do
790
- module_ancestor.valid?
791
-
792
- module_ancestor.errors[:payload_type].should include('must be nil')
793
- end
794
- end
795
-
796
- context 'without payload_type' do
797
- let(:payload_type) do
798
- nil
799
- end
800
-
801
- let(:reference_name) do
802
- FactoryGirl.generate :metasploit_model_module_ancestor_non_payload_reference_name
803
- end
804
-
805
- it { should be_valid }
806
- end
807
- end
808
- end
809
-
810
- it { should validate_presence_of(:real_path_modified_at) }
811
-
812
- context 'real_path_sha1_hex_digest' do
813
- context 'validates format with SHA1_HEX_DIGEST_REGEXP' do
814
- let(:hexdigest) do
815
- Digest::SHA1.hexdigest('')
816
- end
817
-
818
- it 'should allow a Digest::SHA1.hexdigest' do
819
- module_ancestor.should allow_value(hexdigest).for(:real_path_sha1_hex_digest)
820
- end
821
-
822
- it 'should not allow a truncated Digest::SHA1.hexdigest' do
823
- module_ancestor.should_not allow_value(hexdigest[0, 39]).for(:real_path_sha1_hex_digest)
824
- end
825
-
826
- it 'should not allow upper case hex to maintain normalization' do
827
- module_ancestor.should_not allow_value(hexdigest.upcase).for(:real_path_sha1_hex_digest)
828
- end
829
-
830
- it { should_not allow_value(nil).for(:real_path_sha1_hex_digest) }
831
- end
832
- end
833
-
834
- context 'reference_name' do
835
- context 'validates format with REFERENCE_NAME_REGEXP' do
836
- context 'without slashes' do
837
- context 'first character' do
838
- it 'should not allow space' do
839
- module_ancestor.should_not allow_value(' ').for(:reference_name)
840
- end
841
-
842
- it 'should allow dash' do
843
- module_ancestor.should allow_value('-').for(:reference_name)
844
- end
845
-
846
- it 'should allow digit' do
847
- module_ancestor.should allow_value('0').for(:reference_name)
848
- end
849
-
850
- it 'should allow uppercase letter' do
851
- module_ancestor.should allow_value('A').for(:reference_name)
852
- end
853
-
854
- it 'should allow underscore' do
855
- module_ancestor.should allow_value('_').for(:reference_name)
856
- end
857
-
858
- it 'should allow lowercase letter' do
859
- module_ancestor.should allow_value('a').for(:reference_name)
860
- end
861
- end
862
-
863
- context 'later letters' do
864
- let(:lowercase_letters) do
865
- ('a'..'z').to_a
866
- end
867
-
868
- let(:first_letter) do
869
- lowercase_letters.sample
870
- end
871
-
872
- it 'should not allow space' do
873
- module_ancestor.should_not allow_value("#{first_letter} ").for(:reference_name)
874
- end
875
-
876
- it 'should allow dash' do
877
- module_ancestor.should allow_value("#{first_letter}-").for(:reference_name)
878
- end
879
-
880
- it 'should allow digit' do
881
- module_ancestor.should allow_value("#{first_letter}1").for(:reference_name)
882
- end
883
-
884
- it 'should allow uppercase letter' do
885
- module_ancestor.should allow_value("#{first_letter}A").for(:reference_name)
886
- end
887
-
888
- it 'should allow underscore' do
889
- module_ancestor.should allow_value("#{first_letter}_").for(:reference_name)
890
- end
891
-
892
- it 'should allow lowercase letter' do
893
- module_ancestor.should allow_value("#{first_letter}a").for(:reference_name)
894
- end
895
- end
896
- end
897
-
898
- context 'with slashes' do
899
- let(:section) do
900
- "-_0a"
901
- end
902
-
903
- context 'leading' do
904
- it "should not allow '/'" do
905
- module_ancestor.should_not allow_value("/#{section}").for(:reference_name)
906
- end
907
-
908
- it "should not allow '\\'" do
909
- module_ancestor.should_not allow_value("\\#{section}").for(:reference_name)
910
- end
911
- end
912
-
913
- context 'infix' do
914
- it "should allow '/'" do
915
- module_ancestor.should allow_value("#{section}/#{section}").for(:reference_name)
916
- end
917
-
918
- it "should not allow '\\'" do
919
- module_ancestor.should_not allow_value("#{section}\\#{section}").for(:reference_name)
920
- end
921
- end
922
-
923
- context 'trailing' do
924
- it "should not allow '/'" do
925
- module_ancestor.should_not allow_value("#{section}/").for(:reference_name)
926
- end
927
-
928
- it "should not allow '\\'" do
929
- module_ancestor.should_not allow_value("#{section}\\").for(:reference_name)
930
- end
931
- end
932
- end
933
-
934
- context 'real-world examples' do
935
- it { should allow_value('admin/2wire/xslt_password_reset').for(:reference_name) }
936
- it { should allow_value('dos/http/3com_superstack_switch').for(:reference_name) }
937
- it { should allow_value('windows/brightstor/tape_engine_8A').for(:reference_name) }
938
- it { should allow_value('windows/fileformat/a-pdf_wav_to_mp3').for(:reference_name) }
939
- it { should allow_value('windows/ftp/32bitftp_list_reply').for(:reference_name) }
940
- it { should allow_value('windows/ftp/3cdaemon_ftp_user').for(:reference_name) }
941
- end
942
- end
943
- end
944
- end
945
-
946
- context '#contents' do
947
- subject(:contents) do
948
- module_ancestor.contents
949
- end
950
-
951
- before(:each) do
952
- module_ancestor.real_path = real_path
953
- end
954
-
955
- context 'with #real_path' do
956
- let(:real_path) do
957
- module_ancestor.derived_real_path
958
- end
959
-
960
- context 'with file' do
961
- let(:file_contents) do
962
- "# Contents"
963
- end
964
-
965
- before(:each) do
966
- File.open(real_path, 'wb') do |f|
967
- f.write(file_contents)
968
- end
969
- end
970
-
971
- it 'should be contents of file' do
972
- contents.should == file_contents
973
- end
974
- end
975
-
976
- context 'without file' do
977
- before(:each) do
978
- File.delete(real_path)
979
- end
980
-
981
- it { should be_nil }
982
- end
983
- end
984
-
985
- context 'without #real_path' do
986
- let(:real_path) do
987
- nil
988
- end
989
-
990
- it { should be_nil }
991
- end
992
- end
993
-
994
- context '#derived_full_name' do
995
- subject(:derived_full_name) do
996
- module_ancestor.derived_full_name
997
- end
998
-
999
- let(:module_ancestor) do
1000
- FactoryGirl.build(
1001
- module_ancestor_factory,
1002
- :module_type => module_type,
1003
- # don't create parent_path since it's unneeded for tests
1004
- :parent_path => nil
1005
- )
1006
- end
1007
-
1008
- context 'with module_type' do
1009
- let(:module_type) do
1010
- FactoryGirl.generate :metasploit_model_module_type
1011
- end
1012
-
1013
- it "should equal <module_type>/<reference_name>" do
1014
- derived_full_name.should == "#{module_ancestor.module_type}/#{module_ancestor.reference_name}"
1015
- end
1016
- end
1017
-
1018
- context 'without module_type' do
1019
- let(:module_type) do
1020
- nil
1021
- end
1022
-
1023
- it { should be_nil }
1024
- end
1025
- end
1026
-
1027
- context '#derived_module_type' do
1028
- subject(:derived_module_type) do
1029
- module_ancestor.derived_module_type
1030
- end
1031
-
1032
- before(:each) do
1033
- module_ancestor.real_path = real_path
1034
- end
1035
-
1036
- context 'with #real_path' do
1037
- let(:real_path) do
1038
- module_ancestor.derived_real_path
1039
- end
1040
-
1041
- before(:each) do
1042
- module_ancestor.parent_path = module_path
1043
- end
1044
-
1045
- context 'with Metasploit::Model::Module::Path' do
1046
- let(:module_path) do
1047
- module_ancestor.parent_path
1048
- end
1049
-
1050
- before(:each) do
1051
- module_path.real_path = module_path_real_path
1052
- end
1053
-
1054
- context 'with Metasploit::Model::Module::Path#real_path' do
1055
- let(:module_path_real_path) do
1056
- module_path.real_path
1057
- end
1058
-
1059
- it { should_not be_nil }
1060
- end
1061
-
1062
- context 'without Metasploit::Model::Module::Path#real_path' do
1063
- let(:module_path_real_path) do
1064
- nil
1065
- end
1066
-
1067
- it { should be_nil }
1068
- end
1069
- end
1070
-
1071
- context 'without Metasploit::Model::Module::Path' do
1072
- let(:module_path) do
1073
- nil
1074
- end
1075
-
1076
- it { should be_nil }
1077
- end
1078
- end
1079
-
1080
- context 'without #real_path' do
1081
- let(:real_path) do
1082
- nil
1083
- end
1084
-
1085
- it { should be_nil }
1086
- end
1087
- end
1088
-
1089
- context '#derived_payload_type' do
1090
- subject(:derived_payload_type) do
1091
- module_ancestor.derived_payload_type
1092
- end
1093
-
1094
- let(:module_ancestor) do
1095
- FactoryGirl.build(
1096
- module_ancestor_factory,
1097
- :module_type => module_type
1098
- )
1099
- end
1100
-
1101
- context 'with payload' do
1102
- let(:module_type) do
1103
- 'payload'
1104
- end
1105
-
1106
- it 'should singularize payload_type_directory' do
1107
- derived_payload_type.should == module_ancestor.payload_type_directory.singularize
1108
- end
1109
- end
1110
-
1111
- context 'without payload' do
1112
- let(:module_type) do
1113
- FactoryGirl.generate :metasploit_model_non_payload_module_type
1114
- end
1115
-
1116
- it { should be_nil }
1117
- end
1118
- end
1119
-
1120
- context '#derived_real_path' do
1121
- subject(:derived_real_path) do
1122
- module_ancestor.derived_real_path
1123
- end
1124
-
1125
- let(:module_ancestor) do
1126
- FactoryGirl.build(
1127
- module_ancestor_factory,
1128
- :module_type => module_type,
1129
- :parent_path => parent_path,
1130
- :reference_name => reference_name
1131
- )
1132
- end
1133
-
1134
- let(:module_type) do
1135
- nil
1136
- end
1137
-
1138
- let(:parent_path) do
1139
- nil
1140
- end
1141
-
1142
- let(:reference_name) do
1143
- nil
1144
- end
1145
-
1146
- context 'with parent_path' do
1147
- let(:parent_path) do
1148
- FactoryGirl.build(
1149
- module_path_factory,
1150
- :real_path => parent_path_real_path
1151
- )
1152
- end
1153
-
1154
- context 'with parent_path.real_path' do
1155
- let(:parent_path_real_path) do
1156
- FactoryGirl.generate :metasploit_model_module_path_real_path
1157
- end
1158
-
1159
- context 'with module_type' do
1160
- let(:module_type) do
1161
- FactoryGirl.generate :metasploit_model_module_type
1162
- end
1163
-
1164
- context 'with reference_name' do
1165
- let(:reference_name) do
1166
- FactoryGirl.generate :metasploit_model_module_ancestor_non_payload_reference_name
1167
- end
1168
-
1169
- it 'should be full path including parent_path.real_path, type_directory, and reference_path' do
1170
- derived_real_path.should == File.join(
1171
- parent_path_real_path,
1172
- module_ancestor.module_type_directory,
1173
- module_ancestor.reference_path
1174
- )
1175
- end
1176
- end
1177
-
1178
- context 'without reference_name' do
1179
- let(:reference_name) do
1180
- nil
1181
- end
1182
-
1183
- it { should be_nil }
1184
- end
1185
- end
1186
-
1187
- context 'without module_type' do
1188
- let(:module_type) do
1189
- nil
1190
- end
1191
-
1192
- it { should be_nil }
1193
- end
1194
- end
1195
-
1196
- context 'without parent_path.real_path' do
1197
- let(:parent_path_real_path) do
1198
- nil
1199
- end
1200
-
1201
- it { should be_nil }
1202
- end
1203
- end
1204
-
1205
- context 'without parent_path' do
1206
- let(:parent_path) do
1207
- nil
1208
- end
1209
-
1210
- it { should be_nil }
1211
- end
1212
- end
1213
-
1214
- context '#derived_real_path_modified_at' do
1215
- subject(:derived_real_path_modified_at) do
1216
- module_ancestor.derived_real_path_modified_at
1217
- end
1218
-
1219
- let(:module_ancestor) do
1220
- FactoryGirl.build(module_ancestor_factory)
1221
- end
1222
-
1223
- context 'with real_path' do
1224
- before(:each) do
1225
- module_ancestor.real_path = real_path
1226
- end
1227
-
1228
- context 'that exists' do
1229
- let(:real_path) do
1230
- # derived real path will have been created by factory's after(:build)
1231
- module_ancestor.derived_real_path
1232
- end
1233
-
1234
- it 'should be modification time of file' do
1235
- derived_real_path_modified_at.should == File.mtime(real_path)
1236
- end
1237
-
1238
- it 'should be in UTC' do
1239
- derived_real_path_modified_at.zone.should == 'UTC'
1240
- end
1241
- end
1242
-
1243
- context 'that does not exist' do
1244
- let(:real_path) do
1245
- 'non/existent/path'
1246
- end
1247
-
1248
- it { should be_nil }
1249
- end
1250
- end
1251
-
1252
- context 'without real_path' do
1253
- before(:each) do
1254
- module_ancestor.real_path = nil
1255
- end
1256
-
1257
- it 'should have nil for real_path' do
1258
- module_ancestor.real_path.should be_nil
1259
- end
1260
-
1261
- it { should be_nil }
1262
- end
1263
- end
1264
-
1265
- context '#derived_real_path_sha1_hex_digest' do
1266
- subject(:derived_real_path_sha1_hex_digest) do
1267
- module_ancestor.derived_real_path_sha1_hex_digest
1268
- end
1269
-
1270
- let(:module_ancestor) do
1271
- FactoryGirl.build(module_ancestor_factory)
1272
- end
1273
-
1274
- context 'with real_path' do
1275
- before(:each) do
1276
- module_ancestor.real_path = module_ancestor.derived_real_path
1277
- end
1278
-
1279
- context 'that exists' do
1280
- it 'should read the using Digest::SHA1.file' do
1281
- Digest::SHA1.should_receive(:file).with(module_ancestor.real_path).and_call_original
1282
-
1283
- derived_real_path_sha1_hex_digest
1284
- end
1285
-
1286
- context 'with content' do
1287
- let(:content_sha1_hex_digest) do
1288
- Digest::SHA1.hexdigest(content)
1289
- end
1290
-
1291
- before(:each) do
1292
- File.open(module_ancestor.real_path, 'wb') do |f|
1293
- f.write(content)
1294
- end
1295
- end
1296
-
1297
- context 'that is empty' do
1298
- let(:content) do
1299
- ''
1300
- end
1301
-
1302
- it 'should have empty file at real_path' do
1303
- File.size(module_ancestor.real_path).should be_zero
1304
- end
1305
-
1306
- it 'should have SHA1 hex digest for empty string' do
1307
- derived_real_path_sha1_hex_digest.should == content_sha1_hex_digest
1308
- end
1309
- end
1310
-
1311
- context 'that is not empty' do
1312
- let(:content) do
1313
- "# Non-empty content"
1314
- end
1315
-
1316
- it 'should have SHA1 hex digest for content' do
1317
- derived_real_path_sha1_hex_digest.should == content_sha1_hex_digest
1318
- end
1319
- end
1320
- end
1321
- end
1322
-
1323
- context 'that does not exist' do
1324
- before(:each) do
1325
- File.delete(module_ancestor.real_path)
1326
- end
1327
-
1328
- it { should be_nil }
1329
- end
1330
- end
1331
-
1332
- context 'without real_path' do
1333
- before(:each) do
1334
- module_ancestor.real_path = nil
1335
- end
1336
-
1337
- it 'should have nil for real_path' do
1338
- module_ancestor.real_path.should be_nil
1339
- end
1340
-
1341
- it { should be_nil }
1342
- end
1343
- end
1344
-
1345
- context '#derived_reference_name' do
1346
- subject(:derived_reference_name) do
1347
- module_ancestor.derived_reference_name
1348
- end
1349
-
1350
- before(:each) do
1351
- module_ancestor.stub(relative_file_names: relative_file_names)
1352
- end
1353
-
1354
- context 'with empty #relative_file_names' do
1355
- let(:relative_file_names) do
1356
- Enumerator.new { }
1357
- end
1358
-
1359
- it { should be_nil }
1360
- end
1361
-
1362
- context 'without empty #relative_file_names' do
1363
- context 'with one element' do
1364
- let(:relative_file_names) do
1365
- ['a'].each
1366
- end
1367
- end
1368
-
1369
- context 'with more than one element' do
1370
- context 'with EXTENSION' do
1371
- let(:relative_file_names) do
1372
- ['a', 'b', "c#{described_class::EXTENSION}"].each
1373
- end
1374
-
1375
- it 'should not include first file name' do
1376
- derived_reference_name.split(described_class::REFERENCE_NAME_SEPARATOR).should_not include('a')
1377
- end
1378
-
1379
- it 'should match REFERENCE_NAME_REGEXP' do
1380
- derived_reference_name.should match(described_class::REFERENCE_NAME_REGEXP)
1381
- end
1382
-
1383
- it 'should not include EXTENSION' do
1384
- derived_reference_name.should_not end_with(described_class::EXTENSION)
1385
- end
1386
-
1387
- it 'should be all file names except the first joined with the REFERENCE_NAME_SEPARATOR with EXTENSION' do
1388
- derived_reference_name.should == "b#{described_class::REFERENCE_NAME_SEPARATOR}c"
1389
- end
1390
- end
1391
-
1392
- context 'without EXTENSION' do
1393
- let(:relative_file_names) do
1394
- ['a', 'b', 'c'].each
1395
- end
1396
-
1397
- it { should be_nil }
1398
- end
1399
- end
1400
- end
1401
- end
1402
-
1403
- # class method
1404
- context 'handled?' do
1405
- subject(:handled?) do
1406
- module_ancestor_class.handled?(
1407
- :module_type => module_type,
1408
- :payload_type => payload_type
1409
- )
1410
- end
1411
-
1412
- context 'with module_type' do
1413
- context 'payload' do
1414
- let(:module_type) do
1415
- 'payload'
1416
- end
1417
-
1418
- context 'with payload_type' do
1419
- context 'single' do
1420
- let(:payload_type) do
1421
- 'single'
1422
- end
1423
-
1424
- it { should be_true }
1425
- end
1426
-
1427
- context 'stage' do
1428
- let(:payload_type) do
1429
- 'stage'
1430
- end
1431
-
1432
- it { should be_false }
1433
- end
1434
-
1435
- context 'stager' do
1436
- let(:payload_type) do
1437
- 'stager'
1438
- end
1439
-
1440
- it { should be_true }
1441
- end
1442
- end
1443
-
1444
- context 'without payload_type' do
1445
- let(:payload_type) do
1446
- nil
1447
- end
1448
-
1449
- it { should be_false }
1450
- end
1451
- end
1452
-
1453
- context 'non-payload' do
1454
- let(:module_type) do
1455
- FactoryGirl.generate :metasploit_model_non_payload_module_type
1456
- end
1457
-
1458
- context 'with payload_type' do
1459
- context 'single' do
1460
- let(:payload_type) do
1461
- 'single'
1462
- end
1463
-
1464
- it { should be_false }
1465
- end
1466
-
1467
- context 'stage' do
1468
- let(:payload_type) do
1469
- 'stage'
1470
- end
1471
-
1472
- it { should be_false }
1473
- end
1474
-
1475
- context 'stager' do
1476
- let(:payload_type) do
1477
- 'stager'
1478
- end
1479
-
1480
- it { should be_false }
1481
- end
1482
- end
1483
-
1484
- context 'without payload_type' do
1485
- let(:payload_type) do
1486
- nil
1487
- end
1488
-
1489
- it { should be_false }
1490
- end
1491
- end
1492
- end
1493
-
1494
- context 'without module_type' do
1495
- let(:module_type) do
1496
- nil
1497
- end
1498
-
1499
- context 'with payload_type' do
1500
- context 'single' do
1501
- let(:payload_type) do
1502
- 'single'
1503
- end
1504
-
1505
- it { should be_false }
1506
- end
1507
-
1508
- context 'stage' do
1509
- let(:payload_type) do
1510
- 'stage'
1511
- end
1512
-
1513
- it { should be_false }
1514
- end
1515
-
1516
- context 'stager' do
1517
- let(:payload_type) do
1518
- 'stager'
1519
- end
1520
-
1521
- it { should be_false }
1522
- end
1523
- end
1524
-
1525
- context 'without payload_type' do
1526
- let(:payload_type) do
1527
- nil
1528
- end
1529
-
1530
- it { should be_false }
1531
- end
1532
- end
1533
- end
1534
-
1535
- # instance method
1536
- context '#handled?' do
1537
- subject(:handled?) do
1538
- module_ancestor.handled?
1539
- end
1540
-
1541
- let(:module_ancestor) do
1542
- FactoryGirl.build(
1543
- module_ancestor_factory,
1544
- :module_type => module_type,
1545
- :payload_type => payload_type
1546
- )
1547
- end
1548
-
1549
- let(:module_type) do
1550
- 'payload'
1551
- end
1552
-
1553
- let(:payload_type) do
1554
- FactoryGirl.generate :metasploit_model_module_ancestor_payload_type
1555
- end
1556
-
1557
- before(:each) do
1558
- module_ancestor.payload_type = module_ancestor.derived_payload_type
1559
- end
1560
-
1561
- it 'should delegate to class method' do
1562
- module_ancestor_class.should_receive(:handled?).with(
1563
- :module_type => module_type,
1564
- :payload_type => payload_type
1565
- )
1566
-
1567
- handled?
1568
- end
1569
- end
1570
-
1571
- context '#loading_context?' do
1572
- subject(:loading_context?) do
1573
- module_ancestor.send(:loading_context?)
1574
- end
1575
-
1576
- context 'with valid?' do
1577
- it 'should be false' do
1578
- module_ancestor.should_receive(:run_validations!) do
1579
- loading_context?.should be_false
1580
- end
1581
-
1582
- module_ancestor.valid?
1583
- end
1584
- end
1585
-
1586
- context 'with valid?(:loading)' do
1587
- it 'should be true' do
1588
- module_ancestor.should_receive(:run_validations!) do
1589
- loading_context?.should be_true
1590
- end
1591
-
1592
- module_ancestor.valid?(:loading)
1593
- end
1594
- end
1595
- end
1596
-
1597
- context '#payload?' do
1598
- subject(:module_ancestor) do
1599
- module_ancestor_class.new(:module_type => module_type)
1600
- end
1601
-
1602
- context "with 'payload' module_type" do
1603
- let(:module_type) do
1604
- 'payload'
1605
- end
1606
-
1607
- it { should be_payload }
1608
- end
1609
-
1610
- context "without 'payload' module_type" do
1611
- let(:module_type) do
1612
- FactoryGirl.generate :metasploit_model_non_payload_module_type
1613
- end
1614
-
1615
- it { should_not be_payload }
1616
- end
1617
- end
1618
-
1619
- context '#payload_name' do
1620
- subject(:payload_name) do
1621
- module_ancestor.payload_name
1622
- end
1623
-
1624
- let(:module_ancestor) do
1625
- FactoryGirl.build(
1626
- module_ancestor_factory,
1627
- handler_type: handler_type,
1628
- module_type: module_type,
1629
- payload_type: payload_type
1630
- )
1631
- end
1632
-
1633
- context '#module_type' do
1634
- context 'with payload' do
1635
- #
1636
- # Shared examples
1637
- #
1638
-
1639
- shared_examples_for 'prefix payload_name' do
1640
- let(:handler_type) do
1641
- nil
1642
- end
1643
-
1644
- context 'with #reference_name' do
1645
- #
1646
- # lets
1647
- #
1648
-
1649
- let(:expected_payload_name) do
1650
- 'expected/payload/name'
1651
- end
1652
-
1653
- let(:reference_name) do
1654
- "#{payload_type_directory}/#{expected_payload_name}"
1655
- end
1656
-
1657
- #
1658
- # Callbacks
1659
- #
1660
-
1661
- before(:each) do
1662
- module_ancestor.reference_name = reference_name
1663
- end
1664
-
1665
- it "strips #payload_type_directory and '/' from #reference_name" do
1666
- expect(payload_name).to eq(expected_payload_name)
1667
- end
1668
- end
1669
-
1670
- context 'without #reference_name' do
1671
- before(:each) do
1672
- module_ancestor.reference_name = nil
1673
- end
1674
-
1675
- it { should be_nil }
1676
- end
1677
- end
1678
-
1679
- #
1680
- # lets
1681
- #
1682
-
1683
- let(:module_type) do
1684
- 'payload'
1685
- end
1686
-
1687
- context '#payload_type' do
1688
- context 'with single' do
1689
- let(:payload_type) do
1690
- 'single'
1691
- end
1692
-
1693
- it_should_behave_like 'prefix payload_name' do
1694
- let(:payload_type_directory) do
1695
- 'singles'
1696
- end
1697
- end
1698
- end
1699
-
1700
- context 'with stage' do
1701
- let(:payload_type) do
1702
- 'stage'
1703
- end
1704
-
1705
- it_should_behave_like 'prefix payload_name' do
1706
- let(:payload_type_directory) do
1707
- 'stages'
1708
- end
1709
- end
1710
- end
1711
-
1712
- context 'with stager' do
1713
- let(:payload_type) do
1714
- 'stager'
1715
- end
1716
-
1717
- context 'with #handler_type' do
1718
- let(:handler_type) do
1719
- FactoryGirl.generate :metasploit_model_module_handler_type
1720
- end
1721
-
1722
- it 'uses #handler_type' do
1723
- expect(payload_name).to eq(handler_type)
1724
- end
1725
- end
1726
-
1727
- context 'without #handler_type' do
1728
- let(:handler_type) do
1729
- nil
1730
- end
1731
-
1732
- it { should be_nil }
1733
- end
1734
- end
1735
-
1736
- context 'with other' do
1737
- let(:handler_type) do
1738
- nil
1739
- end
1740
-
1741
- let(:payload_type) do
1742
- 'unknown_payload_type'
1743
- end
1744
-
1745
- it { should be_nil }
1746
- end
1747
- end
1748
- end
1749
-
1750
- context 'without payload' do
1751
- let(:handler_type) do
1752
- nil
1753
- end
1754
-
1755
- let(:module_type) do
1756
- FactoryGirl.generate :metasploit_model_non_payload_module_type
1757
- end
1758
-
1759
- let(:payload_type) do
1760
- nil
1761
- end
1762
-
1763
- it { should be_nil }
1764
- end
1765
- end
1766
- end
1767
-
1768
- context '#payload_type_directory' do
1769
- subject(:payload_type_directory) do
1770
- module_ancestor.payload_type_directory
1771
- end
1772
-
1773
- let(:module_ancestor) do
1774
- FactoryGirl.build(
1775
- module_ancestor_factory,
1776
- module_type: module_type
1777
- )
1778
- end
1779
-
1780
- context 'with payload' do
1781
- let(:module_type) do
1782
- 'payload'
1783
- end
1784
-
1785
- before(:each) do
1786
- module_ancestor.reference_name = reference_name
1787
- end
1788
-
1789
- context 'with #reference_name' do
1790
- let(:expected_payload_type_directory) do
1791
- payload_type_directories.sample
1792
- end
1793
-
1794
- let(:payload_type_directories) do
1795
- [
1796
- 'singles',
1797
- 'stages',
1798
- 'stagers'
1799
- ]
1800
- end
1801
-
1802
- let(:reference_name) do
1803
- "#{expected_payload_type_directory}/reference/name/tail"
1804
- end
1805
-
1806
- it 'is name before REFERENCE_NAME_SEPARATOR' do
1807
- expect(payload_type_directory).to eq(expected_payload_type_directory)
1808
- end
1809
- end
1810
-
1811
- context 'without #reference_name' do
1812
- let(:reference_name) do
1813
- nil
1814
- end
1815
-
1816
- it { should be_nil }
1817
- end
1818
- end
1819
-
1820
- context 'without payload' do
1821
- let(:module_type) do
1822
- FactoryGirl.generate :metasploit_model_non_payload_module_type
1823
- end
1824
-
1825
- it { should be_nil }
1826
- end
1827
- end
1828
-
1829
- context '#relative_file_names' do
1830
- subject(:relative_file_names) do
1831
- module_ancestor.relative_file_names
1832
- end
1833
-
1834
- before(:each) do
1835
- module_ancestor.stub(relative_pathname: relative_pathname)
1836
- end
1837
-
1838
- context 'with #relative_pathnames' do
1839
- let(:file_names) do
1840
- [
1841
- 'a',
1842
- 'b',
1843
- 'c'
1844
- ]
1845
- end
1846
-
1847
- let(:relative_pathname) do
1848
- Pathname.new(file_names.join('/'))
1849
- end
1850
-
1851
- it { should be_an Enumerator }
1852
-
1853
- it 'should include all file names, in order' do
1854
- relative_file_names.to_a.should == file_names
1855
- end
1856
- end
1857
-
1858
- context 'without #relative_pathnames' do
1859
- let(:relative_pathname) do
1860
- nil
1861
- end
1862
-
1863
- it { should be_an Enumerator }
1864
- its(:to_a) { should be_empty }
1865
- end
1866
- end
1867
-
1868
- context '#relative_pathname' do
1869
- subject(:relative_pathname) do
1870
- module_ancestor.relative_pathname
1871
- end
1872
-
1873
- before(:each) do
1874
- module_ancestor.stub(real_pathname: real_pathname)
1875
- end
1876
-
1877
- context 'with #real_pathname' do
1878
- let(:real_pathname) do
1879
- Pathname.new('a/b/c')
1880
- end
1881
-
1882
- before(:each) do
1883
- module_ancestor.parent_path = parent_path
1884
- end
1885
-
1886
- context 'with #parent_path' do
1887
- let(:parent_path) do
1888
- module_ancestor.parent_path
1889
- end
1890
-
1891
- before(:each) do
1892
- parent_path.stub(real_pathname: parent_path_real_pathname)
1893
- end
1894
-
1895
- context 'with Metasploit::Model::Module::Path#real_pathname' do
1896
- let(:parent_path_real_pathname) do
1897
- Pathname.new('a')
1898
- end
1899
-
1900
- it { should be_a Pathname }
1901
- it { should be_relative }
1902
-
1903
- it 'should be relative to parent_path.real_pathname' do
1904
- relative_pathname.should == Pathname.new('b/c')
1905
- end
1906
- end
1907
-
1908
- context 'without Metasploit::Model::Module::Path#real_pathname' do
1909
- let(:parent_path_real_pathname) do
1910
- nil
1911
- end
1912
-
1913
- it { should be_nil }
1914
- end
1915
- end
1916
-
1917
- context 'without #parent_path' do
1918
- let(:parent_path) do
1919
- nil
1920
- end
1921
-
1922
- it { should be_nil }
1923
- end
1924
- end
1925
-
1926
- context 'without #real_pathname' do
1927
- let(:real_pathname) do
1928
- nil
1929
- end
1930
-
1931
- it { should be_nil }
1932
- end
1933
- end
1934
-
1935
- context '#reference_path' do
1936
- subject(:reference_path) do
1937
- module_ancestor.reference_path
1938
- end
1939
-
1940
- let(:module_ancestor) do
1941
- module_ancestor_class.new(
1942
- :reference_name => reference_name
1943
- )
1944
- end
1945
-
1946
- context 'with reference_name' do
1947
- let(:reference_name) do
1948
- FactoryGirl.generate :metasploit_model_module_ancestor_non_payload_reference_name
1949
- end
1950
-
1951
- it 'should be reference_name + EXTENSION' do
1952
- reference_path.should == "#{reference_name}#{Metasploit::Model::Module::Ancestor::EXTENSION}"
1953
- end
1954
- end
1955
-
1956
- context 'without reference_name' do
1957
- let(:reference_name) do
1958
- nil
1959
- end
1960
-
1961
- it { should be_nil }
1962
- end
1963
- end
1964
-
1965
- context '#module_type_directory' do
1966
- subject(:module_type_directory) do
1967
- module_ancestor.module_type_directory
1968
- end
1969
-
1970
- let(:module_ancestor) do
1971
- module_ancestor_class.new(
1972
- :module_type => module_type
1973
- )
1974
- end
1975
-
1976
- context 'with module_type' do
1977
- context 'in known types' do
1978
- let(:module_type) do
1979
- FactoryGirl.generate :metasploit_model_module_type
1980
- end
1981
-
1982
- it 'should use Metasploit::Model::Module::Ancestor::DIRECTORY_BY_MODULE_TYPE' do
1983
- module_type_directory.should == Metasploit::Model::Module::Ancestor::DIRECTORY_BY_MODULE_TYPE[module_type]
1984
- end
1985
- end
1986
-
1987
- context 'in unknown types' do
1988
- let(:module_type) do
1989
- 'not_a_type'
1990
- end
1991
-
1992
- it { should be_nil }
1993
- end
1994
- end
1995
-
1996
- context 'without module_type' do
1997
- let(:module_type) do
1998
- nil
1999
- end
2000
-
2001
- it { should be_nil }
2002
- end
2003
- end
2004
- end