metasploit_data_models 0.7.0-java → 0.11.2-java
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.travis.yml +1 -0
- data/app/models/mdm/host.rb +352 -26
- data/app/models/mdm/loot.rb +72 -7
- data/app/models/mdm/{module_action.rb → module/action.rb} +3 -3
- data/app/models/mdm/{module_arch.rb → module/arch.rb} +3 -3
- data/app/models/mdm/{module_author.rb → module/author.rb} +3 -3
- data/app/models/mdm/module/detail.rb +280 -0
- data/app/models/mdm/{module_mixin.rb → module/mixin.rb} +3 -3
- data/app/models/mdm/{module_platform.rb → module/platform.rb} +3 -3
- data/app/models/mdm/module/ref.rb +48 -0
- data/app/models/mdm/{module_target.rb → module/target.rb} +3 -3
- data/app/models/mdm/note.rb +61 -6
- data/app/models/mdm/ref.rb +39 -1
- data/app/models/mdm/service.rb +85 -7
- data/app/models/mdm/session.rb +100 -6
- data/app/models/mdm/vuln.rb +104 -24
- data/db/migrate/20130228214900_change_required_columns_to_null_false_in_web_vulns.rb +1 -17
- data/db/migrate/20130412154159_change_foreign_key_in_module_actions.rb +25 -0
- data/db/migrate/20130412171844_change_foreign_key_in_module_archs.rb +25 -0
- data/db/migrate/20130412173121_change_foreign_key_in_module_authors.rb +25 -0
- data/db/migrate/20130412173640_change_foreign_key_in_module_mixins.rb +25 -0
- data/db/migrate/20130412174254_change_foreign_key_in_module_platforms.rb +25 -0
- data/db/migrate/20130412174719_change_foreign_key_in_module_refs.rb +25 -0
- data/db/migrate/20130412175040_change_foreign_key_in_module_targets.rb +25 -0
- data/db/migrate/20130430151353_change_required_columns_to_null_false_in_hosts.rb +11 -0
- data/db/migrate/20130430162145_enforce_address_uniqueness_in_workspace_in_hosts.rb +23 -0
- data/lib/mdm/module.rb +4 -0
- data/lib/metasploit_data_models.rb +1 -0
- data/lib/metasploit_data_models/change_required_columns_to_null_false.rb +23 -0
- data/lib/metasploit_data_models/version.rb +1 -1
- data/spec/app/models/mdm/host_spec.rb +411 -0
- data/spec/app/models/mdm/host_tag_spec.rb +13 -0
- data/spec/app/models/mdm/{module_action_spec.rb → module/action_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_arch_spec.rb → module/arch_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_author_spec.rb → module/author_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_detail_spec.rb → module/detail_spec.rb} +101 -11
- data/spec/app/models/mdm/{module_mixin_spec.rb → module/mixin_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_platform_spec.rb → module/platform_spec.rb} +6 -6
- data/spec/app/models/mdm/module/ref_spec.rb +62 -0
- data/spec/app/models/mdm/{module_target_spec.rb → module/target_spec.rb} +6 -6
- data/spec/app/models/mdm/ref_spec.rb +62 -0
- data/spec/app/models/mdm/tag_spec.rb +13 -0
- data/spec/app/models/mdm/vuln_ref_spec.rb +13 -0
- data/spec/app/models/mdm/vuln_spec.rb +231 -0
- data/spec/dummy/db/schema.rb +20 -20
- data/spec/factories/mdm/host_tags.rb +9 -0
- data/spec/factories/mdm/hosts.rb +65 -0
- data/spec/factories/mdm/module/actions.rb +14 -0
- data/spec/factories/mdm/module/archs.rb +14 -0
- data/spec/factories/mdm/{module_authors.rb → module/authors.rb} +4 -4
- data/spec/factories/mdm/module/details.rb +66 -0
- data/spec/factories/mdm/module/mixins.rb +14 -0
- data/spec/factories/mdm/module/platforms.rb +14 -0
- data/spec/factories/mdm/module/refs.rb +14 -0
- data/spec/factories/mdm/{module_targets.rb → module/targets.rb} +3 -3
- data/spec/factories/mdm/refs.rb +9 -0
- data/spec/factories/mdm/tags.rb +14 -0
- data/spec/factories/mdm/vuln_refs.rb +4 -0
- data/spec/factories/mdm/vulns.rb +20 -0
- metadata +75 -42
- data/app/models/mdm/module_detail.rb +0 -59
- data/app/models/mdm/module_ref.rb +0 -24
- data/spec/app/models/mdm/module_ref_spec.rb +0 -38
- data/spec/factories/mdm/module_actions.rb +0 -14
- data/spec/factories/mdm/module_archs.rb +0 -14
- data/spec/factories/mdm/module_details.rb +0 -9
- data/spec/factories/mdm/module_mixins.rb +0 -14
- data/spec/factories/mdm/module_platforms.rb +0 -14
- data/spec/factories/mdm/module_refs.rb +0 -14
data/app/models/mdm/vuln.rb
CHANGED
@@ -1,39 +1,125 @@
|
|
1
|
+
# A vulnerability found on a {#host} or {#service}.
|
1
2
|
class Mdm::Vuln < ActiveRecord::Base
|
2
3
|
#
|
3
|
-
#
|
4
|
+
# Associations
|
4
5
|
#
|
5
6
|
|
6
|
-
|
7
|
+
# @!attribute [rw] host
|
8
|
+
# The host with this vulnerability.
|
9
|
+
#
|
10
|
+
# @return [Mdm::Host]
|
11
|
+
belongs_to :host, :class_name => 'Mdm::Host', :counter_cache => :vuln_count
|
7
12
|
|
13
|
+
# @!attribute [rw] service
|
14
|
+
# The service with the vulnerability.
|
8
15
|
#
|
9
|
-
#
|
16
|
+
# @return [Mdm::Service]
|
17
|
+
belongs_to :service, :class_name => 'Mdm::Service'
|
18
|
+
|
19
|
+
# @!attribute [rw] vuln_attempts
|
20
|
+
# Attempts to exploit this vulnerability.
|
10
21
|
#
|
22
|
+
# @return [Array<Mdm::VulnAttempt>]
|
23
|
+
has_many :vuln_attempts, :class_name => 'Mdm::VulnAttempt', :dependent => :destroy
|
11
24
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
has_many :
|
25
|
+
# @!attribute [rw] vuln_details
|
26
|
+
# Additional information about this vulnerability.
|
27
|
+
#
|
28
|
+
# @return [Array<Mdm::VulnDetail>]
|
29
|
+
has_many :vuln_details, :class_name => 'Mdm::VulnDetail', :dependent => :destroy
|
30
|
+
|
31
|
+
# @!attribute [rw] vulns_refs
|
32
|
+
# Join model that joins this vuln to its {Mdm::Ref external references}.
|
33
|
+
#
|
34
|
+
# @todo https://www.pivotaltracker.com/story/show/49004623
|
35
|
+
# @return [Array<Mdm::VulnRef>]
|
36
|
+
has_many :vulns_refs, :class_name => 'Mdm::VulnRef', :dependent => :destroy
|
17
37
|
|
18
38
|
#
|
19
39
|
# Through :vuln_refs
|
20
40
|
#
|
21
|
-
|
41
|
+
|
42
|
+
# @!attribute [r] refs
|
43
|
+
# External references to this vulnerability.
|
44
|
+
#
|
45
|
+
# @todo https://www.pivotaltracker.com/story/show/49004623
|
46
|
+
# @return [Array<Mdm::Ref>]
|
47
|
+
has_many :refs, :class_name => 'Mdm::Ref', :through => :vulns_refs
|
48
|
+
|
49
|
+
#
|
50
|
+
# Through refs
|
51
|
+
#
|
52
|
+
|
53
|
+
# @!attribute [r] module_refs
|
54
|
+
# References in module that match {Mdm::Ref#name names} in {#refs}.
|
55
|
+
#
|
56
|
+
# @return [Array<Mdm::Module::Ref>]
|
57
|
+
has_many :module_refs, :class_name => 'Mdm::Module::Ref', :through => :refs
|
58
|
+
|
59
|
+
#
|
60
|
+
# Through module_refs
|
61
|
+
#
|
62
|
+
|
63
|
+
# @!attribute [r] module_details
|
64
|
+
# {Mdm::Module::Detail Modules} that share the same external references as this vuln.
|
65
|
+
#
|
66
|
+
# @return [Array<Mdm::Module::Detail>]
|
67
|
+
has_many :module_details,
|
68
|
+
:class_name => 'Mdm::Module::Detail',
|
69
|
+
:source => :detail,
|
70
|
+
:through => :module_refs,
|
71
|
+
:uniq => true
|
72
|
+
|
73
|
+
#
|
74
|
+
# Attributes
|
75
|
+
#
|
76
|
+
|
77
|
+
# @!attribute [rw] exploited_at
|
78
|
+
# When the vulnerability was exploited
|
79
|
+
#
|
80
|
+
# @return [DateTime]
|
81
|
+
|
82
|
+
# @!attribute [rw] name
|
83
|
+
# The name of the vulnerability in metasploit-framework or from the import source.
|
84
|
+
#
|
85
|
+
# @return [String]
|
86
|
+
|
87
|
+
# @!attribute [rw] info
|
88
|
+
# Additional information about the vulnerability
|
89
|
+
#
|
90
|
+
# @return [String]
|
91
|
+
|
92
|
+
# @!attribute [rw] vuln_attempt_count
|
93
|
+
# Counter cache for number of {#vuln_attempts}.
|
94
|
+
#
|
95
|
+
# @return [Integer]
|
96
|
+
|
97
|
+
# @!attribute [rw] vuln_detail_count
|
98
|
+
# Counter cache for number of {#vuln_details}.
|
99
|
+
#
|
100
|
+
# @return [Integer]
|
101
|
+
|
102
|
+
#
|
103
|
+
# Callbacks
|
104
|
+
#
|
105
|
+
|
106
|
+
after_update :save_refs
|
22
107
|
|
23
108
|
#
|
24
109
|
# Scopes
|
25
110
|
#
|
26
111
|
|
27
|
-
scope :search, lambda {
|
112
|
+
scope :search, lambda { |query|
|
113
|
+
formatted_query = "%#{query}%"
|
114
|
+
|
28
115
|
where(
|
29
|
-
[
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
'LEFT OUTER JOIN vulns_refs ON vulns_refs.vuln_id=vulns.id LEFT OUTER JOIN refs ON refs.id=vulns_refs.ref_id'
|
116
|
+
arel_table[:name].matches(formatted_query).or(
|
117
|
+
arel_table[:info].matches(formatted_query)
|
118
|
+
).or(
|
119
|
+
Mdm::Ref.arel_table[:name].matches(formatted_query)
|
120
|
+
)
|
121
|
+
).includes(
|
122
|
+
:refs
|
37
123
|
)
|
38
124
|
}
|
39
125
|
|
@@ -46,12 +132,6 @@ class Mdm::Vuln < ActiveRecord::Base
|
|
46
132
|
|
47
133
|
private
|
48
134
|
|
49
|
-
def before_destroy
|
50
|
-
Mdm::VulnRef.delete_all('vuln_id = ?', self.id)
|
51
|
-
Mdm::VulnDetail.delete_all('vuln_id = ?', self.id)
|
52
|
-
Mdm::VulnAttempt.delete_all('vuln_id = ?', self.id)
|
53
|
-
end
|
54
|
-
|
55
135
|
def save_refs
|
56
136
|
refs.each { |ref| ref.save(:validate => false) }
|
57
137
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Changes all the {COLUMNS} in the web_vulns table that are required for {Mdm::WebVuln}, but were previously
|
2
2
|
# :null => true
|
3
|
-
class ChangeRequiredColumnsToNullFalseInWebVulns <
|
3
|
+
class ChangeRequiredColumnsToNullFalseInWebVulns < MetasploitDataModels::ChangeRequiredColumnsToNullFalse
|
4
4
|
# Columns that were previously :null => true, but are actually required to be non-null, so should be
|
5
5
|
# :null => false
|
6
6
|
COLUMNS = [
|
@@ -16,20 +16,4 @@ class ChangeRequiredColumnsToNullFalseInWebVulns < ActiveRecord::Migration
|
|
16
16
|
]
|
17
17
|
# Table in which {COLUMNS} are.
|
18
18
|
TABLE_NAME = :web_vulns
|
19
|
-
|
20
|
-
# Marks all the {COLUMNS} as :null => true
|
21
|
-
def down
|
22
|
-
COLUMNS.each do |column|
|
23
|
-
change_column_null(TABLE_NAME, column, true)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Marks all the {COLUMNS} as :null => false
|
28
|
-
def up
|
29
|
-
COLUMNS.each do |column|
|
30
|
-
change_column_null(TABLE_NAME, column, false)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
19
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_actions.module_detail_id` to `module_actions.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModuleActions < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_actions
|
11
|
+
|
12
|
+
# Renames `module_actions.detail_id` to `module_actions.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_actions.module_detail_id` to `module_actions.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_archs.module_detail_id` to `module_archs.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModuleArchs < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_archs
|
11
|
+
|
12
|
+
# Renames `module_archs.detail_id` to `module_archs.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_archs.module_detail_id` to `module_archs.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_authors.module_detail_id` to `module_authors.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModuleAuthors < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_authors
|
11
|
+
|
12
|
+
# Renames `module_authors.detail_id` to `module_authors.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_authors.module_detail_id` to `module_authors.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_mixins.module_detail_id` to `module_mixins.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModuleMixins < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_mixins
|
11
|
+
|
12
|
+
# Renames `module_mixins.detail_id` to `module_mixins.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_mixins.module_detail_id` to `module_mixins.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_platforms.module_detail_id` to `module_platforms.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModulePlatforms < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_platforms
|
11
|
+
|
12
|
+
# Renames `module_platforms.detail_id` to `module_platforms.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_platforms.module_detail_id` to `module_platforms.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_refs.module_detail_id` to `module_refs.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModuleRefs < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_refs
|
11
|
+
|
12
|
+
# Renames `module_refs.detail_id` to `module_refs.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_refs.module_detail_id` to `module_refs.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Changes `module_targets.module_detail_id` to `module_targets.detail_id` so that foreign key matches the conventional
|
2
|
+
# name when `Mdm::ModuleDetail` became {Mdm::Module::Detail}.
|
3
|
+
class ChangeForeignKeyInModuleTargets < ActiveRecord::Migration
|
4
|
+
#
|
5
|
+
# CONSTANTS
|
6
|
+
#
|
7
|
+
|
8
|
+
NEW_COLUMN_NAME= :detail_id
|
9
|
+
OLD_COLUMN_NAME = :module_detail_id
|
10
|
+
TABLE_NAME = :module_targets
|
11
|
+
|
12
|
+
# Renames `module_targets.detail_id` to `module_targets.module_detail_id`.
|
13
|
+
#
|
14
|
+
# @return [void]
|
15
|
+
def down
|
16
|
+
rename_column TABLE_NAME, NEW_COLUMN_NAME, OLD_COLUMN_NAME
|
17
|
+
end
|
18
|
+
|
19
|
+
# Rename `module_targets.module_detail_id` to `module_targets.detail_id`
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def up
|
23
|
+
rename_column TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Changes all the {COLUMNS} in the hosts table that are required for {Mdm::Host}, but were previously `:null => true`.
|
2
|
+
class ChangeRequiredColumnsToNullFalseInHosts < MetasploitDataModels::ChangeRequiredColumnsToNullFalse
|
3
|
+
# Columns that were previously `:null => true`, but are actually required to be non-null, so should be
|
4
|
+
# `:null => false`
|
5
|
+
COLUMNS = [
|
6
|
+
:address,
|
7
|
+
:workspace_id
|
8
|
+
]
|
9
|
+
# Table in which {COLUMNS} are.
|
10
|
+
TABLE_NAME = :hosts
|
11
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Changes index on address so it scoped to workspace_id and is unique to match the validation in {Mdm::Host} on
|
2
|
+
# {Mdm::Host#address}.
|
3
|
+
class EnforceAddressUniquenessInWorkspaceInHosts < ActiveRecord::Migration
|
4
|
+
TABLE_NAME = :hosts
|
5
|
+
|
6
|
+
# Restores old index on address
|
7
|
+
def down
|
8
|
+
change_table TABLE_NAME do |t|
|
9
|
+
t.remove_index [:workspace_id, :address]
|
10
|
+
|
11
|
+
t.index :address
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Make index on address scope to workspace_id and be unique
|
16
|
+
def up
|
17
|
+
change_table TABLE_NAME do |t|
|
18
|
+
t.remove_index :address
|
19
|
+
|
20
|
+
t.index [:workspace_id, :address], :unique => true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/mdm/module.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module MetasploitDataModels
|
2
|
+
# Changes all the COLUMNS in the table with TABLE_NAME that are required from the table's mode, but were previously
|
3
|
+
# `:null => true`, to `:null => false`.
|
4
|
+
#
|
5
|
+
# @abstract Subclass and define COLUMNS as Array<Symbol> and TABLE_NAME as Symbol.
|
6
|
+
class ChangeRequiredColumnsToNullFalse < ActiveRecord::Migration
|
7
|
+
# Marks all the COLUMNS as `:null => true`
|
8
|
+
def down
|
9
|
+
# Use self.class:: so constants are resolved in subclasses instead of this class.
|
10
|
+
self.class::COLUMNS.each do |column|
|
11
|
+
change_column_null(self.class::TABLE_NAME, column, true)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Marks all the COLUMNS as `:null => false`
|
16
|
+
def up
|
17
|
+
# Use self.class:: so constants are resolved in subclasses instead of this class.
|
18
|
+
self.class::COLUMNS.each do |column|
|
19
|
+
change_column_null(self.class::TABLE_NAME, column, false)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|