metasploit_data_models 0.17.0 → 0.17.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +15 -0
  2. data/.yardopts +1 -1
  3. data/Gemfile +6 -1
  4. data/app/models/mdm/client.rb +3 -1
  5. data/app/models/mdm/cred.rb +7 -2
  6. data/app/models/mdm/event.rb +7 -2
  7. data/app/models/mdm/exploit_attempt.rb +43 -2
  8. data/app/models/mdm/exploited_host.rb +7 -2
  9. data/app/models/mdm/host.rb +85 -49
  10. data/app/models/mdm/host_detail.rb +4 -1
  11. data/app/models/mdm/host_tag.rb +41 -3
  12. data/app/models/mdm/listener.rb +7 -2
  13. data/app/models/mdm/loot.rb +25 -3
  14. data/app/models/mdm/nexpose_console.rb +13 -0
  15. data/app/models/mdm/note.rb +10 -3
  16. data/app/models/mdm/ref.rb +4 -2
  17. data/app/models/mdm/route.rb +7 -1
  18. data/app/models/mdm/service.rb +71 -28
  19. data/app/models/mdm/session.rb +28 -3
  20. data/app/models/mdm/session_event.rb +3 -1
  21. data/app/models/mdm/tag.rb +29 -10
  22. data/app/models/mdm/task.rb +56 -17
  23. data/app/models/mdm/task_cred.rb +7 -3
  24. data/app/models/mdm/task_host.rb +7 -3
  25. data/app/models/mdm/task_service.rb +7 -3
  26. data/app/models/mdm/task_session.rb +7 -2
  27. data/app/models/mdm/user.rb +9 -2
  28. data/app/models/mdm/vuln.rb +27 -7
  29. data/app/models/mdm/vuln_attempt.rb +37 -2
  30. data/app/models/mdm/vuln_detail.rb +9 -1
  31. data/app/models/mdm/vuln_ref.rb +7 -2
  32. data/app/models/mdm/web_form.rb +3 -1
  33. data/app/models/mdm/web_page.rb +3 -1
  34. data/app/models/mdm/web_site.rb +19 -4
  35. data/app/models/mdm/web_vuln.rb +3 -1
  36. data/lib/metasploit_data_models/version.rb +1 -1
  37. data/lib/tasks/yard.rake +7 -0
  38. data/metasploit_data_models.gemspec +3 -1
  39. data/spec/app/models/mdm/host_spec.rb +0 -67
  40. data/spec/app/models/mdm/host_tag_spec.rb +38 -7
  41. data/spec/app/models/mdm/tag_spec.rb +5 -23
  42. metadata +11 -27
@@ -1,7 +1,11 @@
1
1
  class Mdm::TaskCred < ActiveRecord::Base
2
- # attr_accessible :title, :body
3
- belongs_to :cred, :class_name => 'Mdm::Cred'
4
- belongs_to :task, :class_name => 'Mdm::Task'
2
+ belongs_to :cred,
3
+ class_name: 'Mdm::Cred',
4
+ inverse_of: :task_creds
5
+
6
+ belongs_to :task,
7
+ class_name: 'Mdm::Task',
8
+ inverse_of: :task_creds
5
9
 
6
10
  validates :cred_id,
7
11
  :uniqueness => {
@@ -1,7 +1,11 @@
1
1
  class Mdm::TaskHost < ActiveRecord::Base
2
- # attr_accessible :title, :body
3
- belongs_to :host, :class_name => 'Mdm::Host'
4
- belongs_to :task, :class_name => 'Mdm::Task'
2
+ belongs_to :host,
3
+ class_name: 'Mdm::Host',
4
+ inverse_of: :task_hosts
5
+
6
+ belongs_to :task,
7
+ class_name: 'Mdm::Task',
8
+ inverse_of: :task_hosts
5
9
 
6
10
  validates :host_id,
7
11
  :uniqueness => {
@@ -1,7 +1,11 @@
1
1
  class Mdm::TaskService < ActiveRecord::Base
2
- # attr_accessible :title, :body
3
- belongs_to :service, :class_name => 'Mdm::Service'
4
- belongs_to :task, :class_name => 'Mdm::Task'
2
+ belongs_to :service,
3
+ class_name: 'Mdm::Service',
4
+ inverse_of: :task_services
5
+
6
+ belongs_to :task,
7
+ class_name: 'Mdm::Task',
8
+ inverse_of: :task_services
5
9
 
6
10
  validates :service_id,
7
11
  :uniqueness => {
@@ -1,6 +1,11 @@
1
1
  class Mdm::TaskSession < ActiveRecord::Base
2
- belongs_to :session, :class_name => 'Mdm::Session'
3
- belongs_to :task, :class_name => 'Mdm::Task'
2
+ belongs_to :session,
3
+ class_name: 'Mdm::Session',
4
+ inverse_of: :task_sessions
5
+
6
+ belongs_to :task,
7
+ class_name: 'Mdm::Task',
8
+ inverse_of: :task_sessions
4
9
 
5
10
  validates :session_id,
6
11
  :uniqueness => {
@@ -5,8 +5,15 @@ class Mdm::User < ActiveRecord::Base
5
5
  # Relations
6
6
  #
7
7
 
8
- has_many :owned_workspaces, :foreign_key => 'owner_id', :class_name => 'Mdm::Workspace'
9
- has_many :tags, :class_name => 'Mdm::Tag'
8
+ has_many :owned_workspaces,
9
+ class_name: 'Mdm::Workspace',
10
+ foreign_key: 'owner_id',
11
+ inverse_of: :owner
12
+
13
+ has_many :tags,
14
+ class_name: 'Mdm::Tag',
15
+ inverse_of: :user
16
+
10
17
  has_and_belongs_to_many :workspaces, :join_table => 'workspace_members', :uniq => true, :class_name => 'Mdm::Workspace'
11
18
 
12
19
  #
@@ -4,36 +4,57 @@ class Mdm::Vuln < ActiveRecord::Base
4
4
  # Associations
5
5
  #
6
6
 
7
+ # @!attribute exploit_attempts
8
+ # Attempts to exploit this vulnerability.
9
+ #
10
+ # @return [ActiveRecord::Relation<Mdm::ExploitAttempt>]
11
+ has_many :exploit_attempts,
12
+ class_name: 'Mdm::ExploitAttempt',
13
+ inverse_of: :vuln
14
+
7
15
  # @!attribute [rw] host
8
16
  # The host with this vulnerability.
9
17
  #
10
18
  # @return [Mdm::Host]
11
- belongs_to :host, :class_name => 'Mdm::Host', :counter_cache => :vuln_count
19
+ belongs_to :host,
20
+ class_name: 'Mdm::Host',
21
+ counter_cache: :vuln_count,
22
+ inverse_of: :vulns
12
23
 
13
24
  # @!attribute [rw] service
14
25
  # The service with the vulnerability.
15
26
  #
16
27
  # @return [Mdm::Service]
17
- belongs_to :service, :class_name => 'Mdm::Service'
28
+ belongs_to :service,
29
+ class_name: 'Mdm::Service',
30
+ inverse_of: :vulns
18
31
 
19
32
  # @!attribute [rw] vuln_attempts
20
33
  # Attempts to exploit this vulnerability.
21
34
  #
22
35
  # @return [Array<Mdm::VulnAttempt>]
23
- has_many :vuln_attempts, :class_name => 'Mdm::VulnAttempt', :dependent => :destroy
36
+ has_many :vuln_attempts,
37
+ class_name: 'Mdm::VulnAttempt',
38
+ dependent: :destroy,
39
+ inverse_of: :vuln
24
40
 
25
41
  # @!attribute [rw] vuln_details
26
42
  # Additional information about this vulnerability.
27
43
  #
28
44
  # @return [Array<Mdm::VulnDetail>]
29
- has_many :vuln_details, :class_name => 'Mdm::VulnDetail', :dependent => :destroy
45
+ has_many :vuln_details,
46
+ class_name: 'Mdm::VulnDetail',
47
+ dependent: :destroy,
48
+ inverse_of: :vuln
30
49
 
31
50
  # @!attribute [rw] vulns_refs
32
51
  # Join model that joins this vuln to its {Mdm::Ref external references}.
33
52
  #
34
- # @todo https://www.pivotaltracker.com/story/show/49004623
35
53
  # @return [Array<Mdm::VulnRef>]
36
- has_many :vulns_refs, :class_name => 'Mdm::VulnRef', :dependent => :destroy
54
+ has_many :vulns_refs,
55
+ class_name: 'Mdm::VulnRef',
56
+ dependent: :destroy,
57
+ inverse_of: :vuln
37
58
 
38
59
  #
39
60
  # Through :vuln_refs
@@ -42,7 +63,6 @@ class Mdm::Vuln < ActiveRecord::Base
42
63
  # @!attribute [r] refs
43
64
  # External references to this vulnerability.
44
65
  #
45
- # @todo https://www.pivotaltracker.com/story/show/49004623
46
66
  # @return [Array<Mdm::Ref>]
47
67
  has_many :refs, :class_name => 'Mdm::Ref', :through => :vulns_refs
48
68
 
@@ -1,9 +1,44 @@
1
1
  class Mdm::VulnAttempt < ActiveRecord::Base
2
2
  #
3
- # Relations
3
+ # Associations
4
4
  #
5
5
 
6
- belongs_to :vuln, :class_name => 'Mdm::Vuln', :counter_cache => :vuln_attempt_count
6
+ # @!attribute loot
7
+ # Loot gathered from this attempt.
8
+ #
9
+ # @return [Mdm::Loot] if {#exploited} is `true`.
10
+ # @return [nil] if {#exploited} is `false`.
11
+ belongs_to :loot,
12
+ class_name: 'Mdm::Loot',
13
+ inverse_of: :vuln_attempt
14
+
15
+ # @!attribute session
16
+ # The session opened by this attempt.
17
+ #
18
+ # @return [Mdm::Session] if {#exploited} is `true`.
19
+ # @return [nil] if {#exploited} is `false`.
20
+ belongs_to :session,
21
+ class_name: 'Mdm::Session',
22
+ inverse_of: :vuln_attempt
23
+
24
+ # @!attribute vuln
25
+ # The {Mdm::Vuln vulnerability} that this attempt was exploiting.
26
+ #
27
+ # @return [Mdm::Vuln]
28
+ belongs_to :vuln,
29
+ class_name: 'Mdm::Vuln',
30
+ counter_cache: :vuln_attempt_count,
31
+ inverse_of: :vuln_attempts
32
+
33
+ #
34
+ # Attributes
35
+ #
36
+
37
+ # @!attribute [rw] exploited
38
+ # Whether this attempt was successful.
39
+ #
40
+ # @return [true] if {#vuln} was exploited.
41
+ # @return [false] if {#vuln} was not exploited.
7
42
 
8
43
  #
9
44
  # Validations
@@ -2,7 +2,15 @@ class Mdm::VulnDetail < ActiveRecord::Base
2
2
  #
3
3
  # Relations
4
4
  #
5
- belongs_to :vuln, :class_name => 'Mdm::Vuln', :counter_cache => :vuln_detail_count
5
+
6
+ belongs_to :nexpose_console,
7
+ class_name: 'Mdm::NexposeConsole',
8
+ inverse_of: :vuln_details
9
+
10
+ belongs_to :vuln,
11
+ class_name: 'Mdm::Vuln',
12
+ counter_cache: :vuln_detail_count,
13
+ inverse_of: :vuln_details
6
14
 
7
15
  #
8
16
  # Validations
@@ -5,8 +5,13 @@ class Mdm::VulnRef < ActiveRecord::Base
5
5
  # Relations
6
6
  #
7
7
 
8
- belongs_to :ref, :class_name => 'Mdm::Ref'
9
- belongs_to :vuln, :class_name => 'Mdm::Vuln'
8
+ belongs_to :ref,
9
+ class_name: 'Mdm::Ref',
10
+ inverse_of: :vulns_refs
11
+
12
+ belongs_to :vuln,
13
+ class_name: 'Mdm::Vuln',
14
+ inverse_of: :vulns_refs
10
15
 
11
16
  ActiveSupport.run_load_hooks(:mdm_vuln_ref, self)
12
17
  end
@@ -3,7 +3,9 @@ class Mdm::WebForm < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :web_site, :class_name => 'Mdm::WebSite'
6
+ belongs_to :web_site,
7
+ class_name: 'Mdm::WebSite',
8
+ inverse_of: :web_forms
7
9
 
8
10
  #
9
11
  # Serializations
@@ -3,7 +3,9 @@ class Mdm::WebPage < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :web_site, :class_name => 'Mdm::WebSite'
6
+ belongs_to :web_site,
7
+ class_name: 'Mdm::WebSite',
8
+ inverse_of: :web_pages
7
9
 
8
10
  #
9
11
  # Serializations
@@ -3,10 +3,25 @@ class Mdm::WebSite < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :service, :class_name => 'Mdm::Service', :foreign_key => 'service_id'
7
- has_many :web_forms, :dependent => :destroy, :class_name => 'Mdm::WebForm'
8
- has_many :web_pages, :dependent => :destroy, :class_name => 'Mdm::WebPage'
9
- has_many :web_vulns, :dependent => :destroy, :class_name => 'Mdm::WebVuln'
6
+ belongs_to :service,
7
+ class_name: 'Mdm::Service',
8
+ foreign_key: 'service_id',
9
+ inverse_of: :web_sites
10
+
11
+ has_many :web_forms,
12
+ class_name: 'Mdm::WebForm',
13
+ dependent: :destroy,
14
+ inverse_of: :web_site
15
+
16
+ has_many :web_pages,
17
+ class_name: 'Mdm::WebPage',
18
+ dependent: :destroy,
19
+ inverse_of: :web_site
20
+
21
+ has_many :web_vulns,
22
+ class_name: 'Mdm::WebVuln',
23
+ dependent: :destroy,
24
+ inverse_of: :web_site
10
25
 
11
26
  #
12
27
  # Serializations
@@ -36,7 +36,9 @@ class Mdm::WebVuln < ActiveRecord::Base
36
36
  # Associations
37
37
  #
38
38
 
39
- belongs_to :web_site, :class_name => 'Mdm::WebSite'
39
+ belongs_to :web_site,
40
+ class_name: 'Mdm::WebSite',
41
+ inverse_of: :web_vulns
40
42
 
41
43
  #
42
44
  # Attributes
@@ -4,5 +4,5 @@ module MetasploitDataModels
4
4
  # metasploit-framework/data/sql/migrate to db/migrate in this project, not all models have specs that verify the
5
5
  # migrations (with have_db_column and have_db_index) and certain models may not be shared between metasploit-framework
6
6
  # and pro, so models may be removed in the future. Because of the unstable API the version should remain below 1.0.0
7
- VERSION = '0.17.0'
7
+ VERSION = '0.17.1'
8
8
  end
data/lib/tasks/yard.rake CHANGED
@@ -12,6 +12,9 @@ if defined? YARD
12
12
  }
13
13
  end
14
14
 
15
+ # need environment so that yard templates can load ActiveRecord::Base subclasses for Entity-Relationship Diagrams
16
+ task :doc => :eager_load
17
+
15
18
  desc "Shows stats for YARD Documentation including listing undocumented modules, classes, constants, and methods"
16
19
  task :stats => :environment do
17
20
  stats = YARD::CLI::Stats.new
@@ -23,4 +26,8 @@ if defined? YARD
23
26
  desc "Generate YARD documentation"
24
27
  # allow calling namespace to as a task that goes to default task for namespace
25
28
  task :yard => ['yard:doc']
29
+ end
30
+
31
+ task eager_load: :environment do
32
+ Rails.application.eager_load!
26
33
  end
@@ -34,7 +34,9 @@ Gem::Specification.new do |s|
34
34
  # debugging
35
35
  s.add_development_dependency 'pry'
36
36
 
37
- s.add_runtime_dependency 'activerecord', '>= 3.2.13'
37
+ # restrict from rails 4.0 as it requires protected_attributes gem and other changes for compatibility
38
+ # @see MSP-2971
39
+ s.add_runtime_dependency 'activerecord', '>= 3.2.13', '< 4.0.0'
38
40
  s.add_runtime_dependency 'activesupport'
39
41
 
40
42
  if RUBY_PLATFORM =~ /java/
@@ -202,73 +202,6 @@ describe Mdm::Host do
202
202
  it { should belong_to(:workspace).class_name('Mdm::Workspace') }
203
203
  end
204
204
 
205
- context 'callbacks' do
206
- context 'before destroy' do
207
- context 'cleanup_tags' do
208
- context 'with tags' do
209
- let!(:tag) do
210
- FactoryGirl.create(:mdm_tag)
211
- end
212
-
213
- let!(:host) do
214
- FactoryGirl.create(:mdm_host)
215
- end
216
-
217
- context 'with only this host' do
218
- before(:each) do
219
- FactoryGirl.create(
220
- :mdm_host_tag,
221
- :host => host,
222
- :tag => tag
223
- )
224
- end
225
-
226
- it 'should destroy the tags' do
227
- expect {
228
- host.destroy
229
- }.to change(Mdm::Tag, :count).by(-1)
230
- end
231
-
232
- it 'should destroy the host tags' do
233
- expect {
234
- host.destroy
235
- }.to change(Mdm::HostTag, :count).by(-1)
236
- end
237
- end
238
-
239
- context 'with additional hosts' do
240
- let(:other_host) do
241
- FactoryGirl.create(:mdm_host)
242
- end
243
-
244
- before(:each) do
245
- FactoryGirl.create(:mdm_host_tag, :host => host, :tag => tag)
246
- FactoryGirl.create(:mdm_host_tag, :host => other_host, :tag => tag)
247
- end
248
-
249
- it 'should not destroy the tag' do
250
- expect {
251
- host.destroy
252
- }.to_not change(Mdm::Tag, :count)
253
- end
254
-
255
- it 'should destroy the host tags' do
256
- expect {
257
- host.destroy
258
- }.to change(Mdm::HostTag, :count).by(-1)
259
- end
260
-
261
- it "should not destroy the other host's tags" do
262
- host.destroy
263
-
264
- other_host.hosts_tags.count.should == 1
265
- end
266
- end
267
- end
268
- end
269
- end
270
- end
271
-
272
205
  context 'CONSTANTS' do
273
206
  context 'ARCHITECTURES' do
274
207
  subject(:architectures) do
@@ -25,15 +25,46 @@ describe Mdm::HostTag do
25
25
  end
26
26
 
27
27
  context '#destroy' do
28
- it 'should successfully destroy the object' do
29
- host_tag = FactoryGirl.create(:mdm_host_tag)
28
+ let(:tag) do
29
+ FactoryGirl.create(
30
+ :mdm_tag
31
+ )
32
+ end
33
+
34
+ let!(:host_tag) do
35
+ FactoryGirl.create(
36
+ :mdm_host_tag,
37
+ :tag => tag
38
+ )
39
+ end
40
+
41
+ it 'should delete 1 Mdm::HostTag' do
30
42
  expect {
31
43
  host_tag.destroy
32
- }.to_not raise_error
33
- expect {
34
- host_tag.reload
35
- }.to raise_error(ActiveRecord::RecordNotFound)
44
+ }.to change(Mdm::HostTag, :count).by(-1)
45
+ end
46
+
47
+ context 'with multiple Mdm::HostTags using same Mdm::Tag' do
48
+ let!(:other_host_tag) do
49
+ FactoryGirl.create(
50
+ :mdm_host_tag,
51
+ :tag => tag
52
+ )
53
+ end
54
+
55
+ it 'should not delete Mdm::Tag' do
56
+ expect {
57
+ host_tag.destroy
58
+ }.to_not change(Mdm::Tag, :count)
59
+ end
36
60
  end
37
- end
38
61
 
62
+ context 'with only one Mdm::HostTag using Mdm::Tag' do
63
+ it 'should delete Mdm::Tag' do
64
+ expect {
65
+ host_tag.destroy
66
+ }.to change(Mdm::Tag, :count).by(-1)
67
+ end
68
+ end
69
+ end
39
70
  end