metasploit_data_models 0.7.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. data/.gitignore +24 -0
  2. data/.rspec +3 -0
  3. data/.simplecov +38 -0
  4. data/.travis.yml +6 -0
  5. data/.yardopts +4 -0
  6. data/Gemfile +27 -0
  7. data/LICENSE +27 -0
  8. data/README.md +72 -0
  9. data/Rakefile +53 -0
  10. data/app/models/mdm/api_key.rb +20 -0
  11. data/app/models/mdm/client.rb +9 -0
  12. data/app/models/mdm/cred.rb +93 -0
  13. data/app/models/mdm/event.rb +30 -0
  14. data/app/models/mdm/exploit_attempt.rb +14 -0
  15. data/app/models/mdm/exploited_host.rb +11 -0
  16. data/app/models/mdm/host.rb +134 -0
  17. data/app/models/mdm/host_detail.rb +15 -0
  18. data/app/models/mdm/host_tag.rb +13 -0
  19. data/app/models/mdm/imported_cred.rb +10 -0
  20. data/app/models/mdm/listener.rb +24 -0
  21. data/app/models/mdm/loot.rb +63 -0
  22. data/app/models/mdm/macro.rb +20 -0
  23. data/app/models/mdm/mod_ref.rb +3 -0
  24. data/app/models/mdm/module_action.rb +24 -0
  25. data/app/models/mdm/module_arch.rb +24 -0
  26. data/app/models/mdm/module_author.rb +25 -0
  27. data/app/models/mdm/module_detail.rb +59 -0
  28. data/app/models/mdm/module_mixin.rb +24 -0
  29. data/app/models/mdm/module_platform.rb +24 -0
  30. data/app/models/mdm/module_ref.rb +24 -0
  31. data/app/models/mdm/module_target.rb +26 -0
  32. data/app/models/mdm/nexpose_console.rb +20 -0
  33. data/app/models/mdm/note.rb +49 -0
  34. data/app/models/mdm/profile.rb +9 -0
  35. data/app/models/mdm/ref.rb +14 -0
  36. data/app/models/mdm/report.rb +50 -0
  37. data/app/models/mdm/report_template.rb +27 -0
  38. data/app/models/mdm/route.rb +9 -0
  39. data/app/models/mdm/service.rb +56 -0
  40. data/app/models/mdm/session.rb +48 -0
  41. data/app/models/mdm/session_event.rb +9 -0
  42. data/app/models/mdm/tag.rb +46 -0
  43. data/app/models/mdm/task.rb +41 -0
  44. data/app/models/mdm/user.rb +25 -0
  45. data/app/models/mdm/vuln.rb +60 -0
  46. data/app/models/mdm/vuln_attempt.rb +15 -0
  47. data/app/models/mdm/vuln_detail.rb +14 -0
  48. data/app/models/mdm/vuln_ref.rb +13 -0
  49. data/app/models/mdm/web_form.rb +16 -0
  50. data/app/models/mdm/web_page.rb +16 -0
  51. data/app/models/mdm/web_site.rb +47 -0
  52. data/app/models/mdm/web_vuln.rb +190 -0
  53. data/app/models/mdm/wmap_request.rb +3 -0
  54. data/app/models/mdm/wmap_target.rb +3 -0
  55. data/app/models/mdm/workspace.rb +196 -0
  56. data/bin/mdm_console +68 -0
  57. data/console_db.yml +9 -0
  58. data/db/migrate/000_create_tables.rb +79 -0
  59. data/db/migrate/001_add_wmap_tables.rb +35 -0
  60. data/db/migrate/002_add_workspaces.rb +36 -0
  61. data/db/migrate/003_move_notes.rb +20 -0
  62. data/db/migrate/004_add_events_table.rb +16 -0
  63. data/db/migrate/005_expand_info.rb +58 -0
  64. data/db/migrate/006_add_timestamps.rb +26 -0
  65. data/db/migrate/007_add_loots.rb +20 -0
  66. data/db/migrate/008_create_users.rb +16 -0
  67. data/db/migrate/009_add_loots_ctype.rb +10 -0
  68. data/db/migrate/010_add_alert_fields.rb +16 -0
  69. data/db/migrate/011_add_reports.rb +19 -0
  70. data/db/migrate/012_add_tasks.rb +24 -0
  71. data/db/migrate/013_add_tasks_result.rb +10 -0
  72. data/db/migrate/014_add_loots_fields.rb +12 -0
  73. data/db/migrate/015_rename_user.rb +16 -0
  74. data/db/migrate/016_add_host_purpose.rb +10 -0
  75. data/db/migrate/017_expand_info2.rb +58 -0
  76. data/db/migrate/018_add_workspace_user_info.rb +29 -0
  77. data/db/migrate/019_add_workspace_desc.rb +23 -0
  78. data/db/migrate/020_add_user_preferences.rb +11 -0
  79. data/db/migrate/021_standardize_info_and_data.rb +18 -0
  80. data/db/migrate/022_enlarge_event_info.rb +10 -0
  81. data/db/migrate/023_add_report_downloaded_at.rb +10 -0
  82. data/db/migrate/024_convert_service_info_to_text.rb +12 -0
  83. data/db/migrate/025_add_user_admin.rb +19 -0
  84. data/db/migrate/026_add_creds_table.rb +19 -0
  85. data/db/migrate/20100819123300_migrate_cred_data.rb +154 -0
  86. data/db/migrate/20100824151500_add_exploited_table.rb +16 -0
  87. data/db/migrate/20100908001428_add_owner_to_workspaces.rb +9 -0
  88. data/db/migrate/20100911122000_add_report_templates.rb +18 -0
  89. data/db/migrate/20100916151530_require_admin_flag.rb +15 -0
  90. data/db/migrate/20100916175000_add_campaigns_and_templates.rb +61 -0
  91. data/db/migrate/20100920012100_add_generate_exe_column.rb +8 -0
  92. data/db/migrate/20100926214000_add_template_prefs.rb +11 -0
  93. data/db/migrate/20101001000000_add_web_tables.rb +57 -0
  94. data/db/migrate/20101002000000_add_query.rb +10 -0
  95. data/db/migrate/20101007000000_add_vuln_info.rb +15 -0
  96. data/db/migrate/20101008111800_add_clients_to_campaigns.rb +10 -0
  97. data/db/migrate/20101009023300_add_campaign_attachments.rb +15 -0
  98. data/db/migrate/20101104135100_add_imported_creds.rb +17 -0
  99. data/db/migrate/20101203000000_fix_web_tables.rb +34 -0
  100. data/db/migrate/20101203000001_expand_host_comment.rb +12 -0
  101. data/db/migrate/20101206212033_add_limit_to_network_to_workspaces.rb +9 -0
  102. data/db/migrate/20110112154300_add_module_uuid_to_tasks.rb +9 -0
  103. data/db/migrate/20110204112800_add_host_tags.rb +28 -0
  104. data/db/migrate/20110317144932_add_session_table.rb +110 -0
  105. data/db/migrate/20110414180600_add_local_id_to_session_table.rb +11 -0
  106. data/db/migrate/20110415175705_add_routes_table.rb +18 -0
  107. data/db/migrate/20110422000000_convert_binary.rb +73 -0
  108. data/db/migrate/20110425095900_add_last_seen_to_sessions.rb +8 -0
  109. data/db/migrate/20110513143900_track_successful_exploits.rb +31 -0
  110. data/db/migrate/20110517160800_rename_and_prune_nessus_vulns.rb +26 -0
  111. data/db/migrate/20110527000000_add_task_id_to_reports_table.rb +11 -0
  112. data/db/migrate/20110527000001_add_api_keys_table.rb +12 -0
  113. data/db/migrate/20110606000001_add_macros_table.rb +16 -0
  114. data/db/migrate/20110622000000_add_settings_to_tasks_table.rb +12 -0
  115. data/db/migrate/20110624000001_add_listeners_table.rb +19 -0
  116. data/db/migrate/20110625000001_add_macro_to_listeners_table.rb +12 -0
  117. data/db/migrate/20110630000001_add_nexpose_consoles_table.rb +21 -0
  118. data/db/migrate/20110630000002_add_name_to_nexpose_consoles_table.rb +12 -0
  119. data/db/migrate/20110717000001_add_profiles_table.rb +15 -0
  120. data/db/migrate/20110727163801_expand_cred_ptype_column.rb +9 -0
  121. data/db/migrate/20110730000001_add_initial_indexes.rb +85 -0
  122. data/db/migrate/20110812000001_prune_indexes.rb +23 -0
  123. data/db/migrate/20110922000000_expand_notes.rb +9 -0
  124. data/db/migrate/20110928101300_add_mod_ref_table.rb +17 -0
  125. data/db/migrate/20111011110000_add_display_name_to_reports_table.rb +24 -0
  126. data/db/migrate/20111203000000_inet_columns.rb +13 -0
  127. data/db/migrate/20111204000000_more_inet_columns.rb +17 -0
  128. data/db/migrate/20111210000000_add_scope_to_hosts.rb +9 -0
  129. data/db/migrate/20120126110000_add_virtual_host_to_hosts.rb +9 -0
  130. data/db/migrate/20120411173220_rename_workspace_members.rb +9 -0
  131. data/db/migrate/20120601152442_add_counter_caches_to_hosts.rb +21 -0
  132. data/db/migrate/20120625000000_add_vuln_details.rb +34 -0
  133. data/db/migrate/20120625000001_add_host_details.rb +16 -0
  134. data/db/migrate/20120625000002_expand_details.rb +16 -0
  135. data/db/migrate/20120625000003_expand_details2.rb +24 -0
  136. data/db/migrate/20120625000004_add_vuln_attempts.rb +19 -0
  137. data/db/migrate/20120625000005_add_vuln_and_host_counter_caches.rb +14 -0
  138. data/db/migrate/20120625000006_add_module_details.rb +118 -0
  139. data/db/migrate/20120625000007_add_exploit_attempts.rb +26 -0
  140. data/db/migrate/20120625000008_add_fail_message.rb +12 -0
  141. data/db/migrate/20120718202805_add_owner_and_payload_to_web_vulns.rb +13 -0
  142. data/db/migrate/20130228214900_change_required_columns_to_null_false_in_web_vulns.rb +35 -0
  143. data/db/migrate/20130423211152_add_creds_counter_cache.rb +24 -0
  144. data/lib/mdm.rb +12 -0
  145. data/lib/mdm/host/operating_system_normalization.rb +984 -0
  146. data/lib/metasploit_data_models.rb +60 -0
  147. data/lib/metasploit_data_models/base64_serializer.rb +103 -0
  148. data/lib/metasploit_data_models/engine.rb +23 -0
  149. data/lib/metasploit_data_models/serialized_prefs.rb +23 -0
  150. data/lib/metasploit_data_models/validators/ip_format_validator.rb +13 -0
  151. data/lib/metasploit_data_models/validators/password_is_strong_validator.rb +70 -0
  152. data/lib/metasploit_data_models/version.rb +8 -0
  153. data/lib/tasks/yard.rake +26 -0
  154. data/metasploit_data_models.gemspec +54 -0
  155. data/script/rails +8 -0
  156. data/spec/app/models/mdm/module_action_spec.rb +38 -0
  157. data/spec/app/models/mdm/module_arch_spec.rb +38 -0
  158. data/spec/app/models/mdm/module_author_spec.rb +50 -0
  159. data/spec/app/models/mdm/module_detail_spec.rb +291 -0
  160. data/spec/app/models/mdm/module_mixin_spec.rb +38 -0
  161. data/spec/app/models/mdm/module_platform_spec.rb +38 -0
  162. data/spec/app/models/mdm/module_ref_spec.rb +38 -0
  163. data/spec/app/models/mdm/module_target_spec.rb +41 -0
  164. data/spec/app/models/mdm/web_vuln_spec.rb +126 -0
  165. data/spec/dummy/Rakefile +7 -0
  166. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  167. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  168. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  169. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  170. data/spec/dummy/app/mailers/.gitkeep +0 -0
  171. data/spec/dummy/app/models/.gitkeep +0 -0
  172. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  173. data/spec/dummy/config.ru +4 -0
  174. data/spec/dummy/config/application.rb +61 -0
  175. data/spec/dummy/config/boot.rb +10 -0
  176. data/spec/dummy/config/database.yml.example +22 -0
  177. data/spec/dummy/config/database.yml.travis +22 -0
  178. data/spec/dummy/config/environment.rb +5 -0
  179. data/spec/dummy/config/environments/development.rb +37 -0
  180. data/spec/dummy/config/environments/production.rb +67 -0
  181. data/spec/dummy/config/environments/test.rb +37 -0
  182. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  183. data/spec/dummy/config/initializers/inflections.rb +15 -0
  184. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  185. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  186. data/spec/dummy/config/initializers/session_store.rb +8 -0
  187. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  188. data/spec/dummy/config/routes.rb +2 -0
  189. data/spec/dummy/db/schema.rb +639 -0
  190. data/spec/dummy/lib/assets/.gitkeep +0 -0
  191. data/spec/dummy/log/.gitkeep +0 -0
  192. data/spec/dummy/public/404.html +26 -0
  193. data/spec/dummy/public/422.html +26 -0
  194. data/spec/dummy/public/500.html +25 -0
  195. data/spec/dummy/public/favicon.ico +0 -0
  196. data/spec/dummy/script/rails +6 -0
  197. data/spec/factories/mdm/addresses.rb +7 -0
  198. data/spec/factories/mdm/hosts.rb +18 -0
  199. data/spec/factories/mdm/module_actions.rb +14 -0
  200. data/spec/factories/mdm/module_archs.rb +14 -0
  201. data/spec/factories/mdm/module_authors.rb +22 -0
  202. data/spec/factories/mdm/module_details.rb +9 -0
  203. data/spec/factories/mdm/module_mixins.rb +14 -0
  204. data/spec/factories/mdm/module_platforms.rb +14 -0
  205. data/spec/factories/mdm/module_refs.rb +14 -0
  206. data/spec/factories/mdm/module_targets.rb +19 -0
  207. data/spec/factories/mdm/services.rb +35 -0
  208. data/spec/factories/mdm/users.rb +22 -0
  209. data/spec/factories/mdm/web_sites.rb +8 -0
  210. data/spec/factories/mdm/web_vulns.rb +64 -0
  211. data/spec/factories/mdm/workspaces.rb +23 -0
  212. data/spec/lib/base64_serializer_spec.rb +174 -0
  213. data/spec/spec_helper.rb +36 -0
  214. metadata +472 -0
@@ -0,0 +1,134 @@
1
+
2
+ class Mdm::Host < ActiveRecord::Base
3
+ include Mdm::Host::OperatingSystemNormalization
4
+
5
+ #
6
+ # Callbacks
7
+ #
8
+
9
+ before_destroy :cleanup_tags
10
+
11
+ #
12
+ # CONSTANTS
13
+ #
14
+
15
+ # Fields searched for the search scope
16
+ SEARCH_FIELDS = [
17
+ 'address::text',
18
+ 'hosts.name',
19
+ 'os_name',
20
+ 'os_flavor',
21
+ 'os_sp',
22
+ 'mac',
23
+ 'purpose',
24
+ 'comments'
25
+ ]
26
+
27
+ #
28
+ # Relations
29
+ #
30
+
31
+ has_many :exploit_attempts, :dependent => :destroy, :class_name => 'Mdm::ExploitAttempt'
32
+ has_many :exploited_hosts, :dependent => :destroy, :class_name => 'Mdm::ExploitedHost'
33
+ has_many :clients, :dependent => :delete_all, :class_name => 'Mdm::Client'
34
+ has_many :host_details, :dependent => :destroy, :class_name => 'Mdm::HostDetail'
35
+ # hosts_tags are cleaned up in before_destroy:
36
+ has_many :hosts_tags, :class_name => 'Mdm::HostTag'
37
+ has_many :loots, :dependent => :destroy, :class_name => 'Mdm::Loot', :order => 'loots.created_at desc'
38
+ has_many :notes, :dependent => :delete_all, :class_name => 'Mdm::Note', :order => 'notes.created_at'
39
+ has_many :services, :dependent => :destroy, :class_name => 'Mdm::Service', :order => 'services.port, services.proto'
40
+ has_many :sessions, :dependent => :destroy, :class_name => 'Mdm::Session', :order => 'sessions.opened_at'
41
+ has_many :vulns, :dependent => :delete_all, :class_name => 'Mdm::Vuln'
42
+ belongs_to :workspace, :class_name => 'Mdm::Workspace'
43
+
44
+ #
45
+ # Through host_tags
46
+ #
47
+ has_many :tags, :through => :hosts_tags, :class_name => 'Mdm::Tag'
48
+
49
+ #
50
+ # Through services
51
+ #
52
+ has_many :creds, :through => :services, :class_name => 'Mdm::Cred'
53
+ has_many :service_notes, :through => :services
54
+ has_many :web_sites, :through => :services, :class_name => 'Mdm::WebSite'
55
+
56
+ #
57
+ # Nested Attributes
58
+ # @note Must be declared after relations being referenced.
59
+ #
60
+
61
+ accepts_nested_attributes_for :services, :reject_if => lambda { |s| s[:port].blank? }, :allow_destroy => true
62
+
63
+ #
64
+ # Validations
65
+ #
66
+
67
+ validates :address,
68
+ :exclusion => {
69
+ :in => ['127.0.0.1']
70
+ },
71
+ :ip_format => true,
72
+ :presence => true,
73
+ :uniqueness => {
74
+ :scope => :workspace_id,
75
+ :unless => :ip_address_invalid?
76
+ }
77
+ validates :workspace, :presence => true
78
+
79
+ #
80
+ # Scopes
81
+ #
82
+
83
+ scope :alive, where({'hosts.state' => 'alive'})
84
+ scope :flagged, where('notes.critical = true AND notes.seen = false').includes(:notes)
85
+ scope :search,
86
+ lambda { |*args|
87
+ # @todo replace with AREL
88
+ terms = SEARCH_FIELDS.collect { |field|
89
+ "#{field} ILIKE ?"
90
+ }
91
+ disjunction = terms.join(' OR ')
92
+ formatted_parameter = "%#{args[0]}%"
93
+ parameters = [formatted_parameter] * SEARCH_FIELDS.length
94
+ conditions = [disjunction] + parameters
95
+
96
+ {
97
+ :conditions => conditions
98
+ }
99
+ }
100
+ scope :tag_search,
101
+ lambda { |*args| where("tags.name" => args[0]).includes(:tags) }
102
+
103
+ def attribute_locked?(attr)
104
+ n = notes.find_by_ntype("host.updated.#{attr}")
105
+ n && n.data[:locked]
106
+ end
107
+
108
+ def cleanup_tags
109
+ # No need to keep tags with no hosts
110
+ tags.each do |tag|
111
+ tag.destroy if tag.hosts == [self]
112
+ end
113
+ # Clean up association table records
114
+ Mdm::HostTag.delete_all("host_id = #{self.id}")
115
+ end
116
+
117
+ # This is replicated by the IpAddressValidator class. Had to put it here as well to avoid
118
+ # SQL errors when checking address uniqueness.
119
+ def ip_address_invalid?
120
+ begin
121
+ potential_ip = IPAddr.new(address)
122
+ return true unless potential_ip.ipv4? || potential_ip.ipv6?
123
+ rescue ArgumentError
124
+ return true
125
+ end
126
+ end
127
+
128
+ def is_vm?
129
+ !!self.virtual_host
130
+ end
131
+
132
+ ActiveSupport.run_load_hooks(:mdm_host, self)
133
+ end
134
+
@@ -0,0 +1,15 @@
1
+ class Mdm::HostDetail < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+
6
+ belongs_to :host, :class_name => 'Mdm::Host', :counter_cache => :host_detail_count
7
+
8
+ #
9
+ # Validations
10
+ #
11
+
12
+ validates :host_id, :presence => true
13
+
14
+ ActiveSupport.run_load_hooks(:mdm_host_detail, self)
15
+ end
@@ -0,0 +1,13 @@
1
+ class Mdm::HostTag < ActiveRecord::Base
2
+ self.table_name = "hosts_tags"
3
+
4
+ #
5
+ # Relations
6
+ #
7
+
8
+ belongs_to :host, :class_name => 'Mdm::Host'
9
+ belongs_to :tag, :class_name => 'Mdm::Tag'
10
+
11
+ ActiveSupport.run_load_hooks(:mdm_host_tag, self)
12
+ end
13
+
@@ -0,0 +1,10 @@
1
+ class Mdm::ImportedCred < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+
6
+ belongs_to :workspace, :class_name => "Mdm::Workspace"
7
+
8
+ ActiveSupport.run_load_hooks(:mdm_imported_cred, self)
9
+ end
10
+
@@ -0,0 +1,24 @@
1
+ class Mdm::Listener < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+
6
+ belongs_to :task, :class_name => 'Mdm::Task'
7
+ belongs_to :workspace, :class_name => 'Mdm::Workspace'
8
+
9
+ #
10
+ # Serializations
11
+ #
12
+
13
+ serialize :options, MetasploitDataModels::Base64Serializer.new
14
+
15
+ #
16
+ # Validations
17
+ #
18
+
19
+ validates :address, :ip_format => true, :presence => true
20
+ validates :port, :presence => true
21
+
22
+ ActiveSupport.run_load_hooks(:mdm_listener, self)
23
+ end
24
+
@@ -0,0 +1,63 @@
1
+ class Mdm::Loot < ActiveRecord::Base
2
+ #
3
+ # Callbacks
4
+ #
5
+
6
+ before_destroy :delete_file
7
+
8
+ #
9
+ # CONSTANTS
10
+ #
11
+
12
+ RELATIVE_SEARCH_FIELDS = [
13
+ 'ltype',
14
+ 'name',
15
+ 'info',
16
+ 'data'
17
+ ]
18
+
19
+ #
20
+ # Relations
21
+ #
22
+
23
+ belongs_to :host, :class_name => 'Mdm::Host'
24
+ belongs_to :service, :class_name => 'Mdm::Service'
25
+ belongs_to :workspace, :class_name => 'Mdm::Workspace'
26
+
27
+ #
28
+ # Scopes
29
+ #
30
+
31
+ scope :search, lambda { |*args|
32
+ # @todo replace with AREL
33
+ terms = RELATIVE_SEARCH_FIELDS.collect { |relative_field|
34
+ "loots.#{relative_field} ILIKE ?"
35
+ }
36
+ disjunction = terms.join(' OR ')
37
+ formatted_parameter = "%#{args[0]}%"
38
+ parameters = [formatted_parameter] * RELATIVE_SEARCH_FIELDS.length
39
+ conditions = [disjunction] + parameters
40
+
41
+ where(conditions)
42
+ }
43
+
44
+ #
45
+ # Serializations
46
+ #
47
+
48
+ serialize :data, MetasploitDataModels::Base64Serializer.new
49
+
50
+ private
51
+
52
+ def delete_file
53
+ c = Pro::Client.get rescue nil
54
+ if c
55
+ c.loot_delete_file(self[:id])
56
+ else
57
+ ::File.unlink(self.path) rescue nil
58
+ end
59
+ end
60
+
61
+ ActiveSupport.run_load_hooks(:mdm_loot, self)
62
+ end
63
+
@@ -0,0 +1,20 @@
1
+ class Mdm::Macro < ActiveRecord::Base
2
+ extend MetasploitDataModels::SerializedPrefs
3
+
4
+ #
5
+ # Serialization
6
+ #
7
+
8
+ serialize :actions, MetasploitDataModels::Base64Serializer.new
9
+ serialize :prefs, MetasploitDataModels::Base64Serializer.new
10
+ serialized_prefs_attr_accessor :max_time
11
+
12
+ #
13
+ # Validations
14
+ #
15
+
16
+ validates :name, :presence => true, :format => /^[^'|"]+$/
17
+
18
+ ActiveSupport.run_load_hooks(:mdm_macro, self)
19
+ end
20
+
@@ -0,0 +1,3 @@
1
+ class Mdm::ModRef < ActiveRecord::Base
2
+ ActiveSupport.run_load_hooks(:mdm_mod_ref, self)
3
+ end
@@ -0,0 +1,24 @@
1
+ class Mdm::ModuleAction < ActiveRecord::Base
2
+ self.table_name = 'module_actions'
3
+
4
+ #
5
+ # Associations
6
+ #
7
+
8
+ belongs_to :module_detail, :class_name => 'Mdm::ModuleDetail'
9
+
10
+ #
11
+ # Mass Assignment Security
12
+ #
13
+
14
+ attr_accessible :name
15
+
16
+ #
17
+ # Validations
18
+ #
19
+
20
+ validates :module_detail, :presence => true
21
+ validates :name, :presence => true
22
+
23
+ ActiveSupport.run_load_hooks(:mdm_module_action, self)
24
+ end
@@ -0,0 +1,24 @@
1
+ class Mdm::ModuleArch < ActiveRecord::Base
2
+ self.table_name = 'module_archs'
3
+
4
+ #
5
+ # Associations
6
+ #
7
+
8
+ belongs_to :module_detail, :class_name => 'Mdm::ModuleDetail'
9
+
10
+ #
11
+ # Mass Assignment Security
12
+ #
13
+
14
+ attr_accessible :name
15
+
16
+ #
17
+ # Validations
18
+ #
19
+
20
+ validates :module_detail, :presence => true
21
+ validates :name, :presence => true
22
+
23
+ ActiveSupport.run_load_hooks(:mdm_module_arch, self)
24
+ end
@@ -0,0 +1,25 @@
1
+ class Mdm::ModuleAuthor < ActiveRecord::Base
2
+ self.table_name = 'module_authors'
3
+
4
+ #
5
+ # Associations
6
+ #
7
+
8
+ belongs_to :module_detail, :class_name => 'Mdm::ModuleDetail'
9
+
10
+ #
11
+ # Mass Assignment Security
12
+ #
13
+
14
+ attr_accessible :email
15
+ attr_accessible :name
16
+
17
+ #
18
+ # Validations
19
+ #
20
+
21
+ validates :module_detail, :presence => true
22
+ validates :name, :presence => true
23
+
24
+ ActiveSupport.run_load_hooks(:mdm_module_author, self)
25
+ end
@@ -0,0 +1,59 @@
1
+ class Mdm::ModuleDetail < ActiveRecord::Base
2
+ self.table_name = 'module_details'
3
+
4
+ #
5
+ # Associations
6
+ #
7
+
8
+ has_many :actions, :class_name => 'Mdm::ModuleAction', :dependent => :destroy, :source => :module_action
9
+ has_many :archs, :class_name => 'Mdm::ModuleArch', :dependent => :destroy, :source => :module_arch
10
+ has_many :authors, :class_name => 'Mdm::ModuleAuthor', :dependent => :destroy, :source => :module_author
11
+ has_many :mixins, :class_name => 'Mdm::ModuleMixin', :dependent => :destroy, :source => :module_mixin
12
+ has_many :platforms, :class_name => 'Mdm::ModulePlatform', :dependent => :destroy, :source => :module_platform
13
+ has_many :refs, :class_name => 'Mdm::ModuleRef', :dependent => :destroy, :source => :module_ref
14
+ has_many :targets, :class_name => 'Mdm::ModuleTarget', :dependent => :destroy, :source => :module_target
15
+
16
+ #
17
+ # Validations
18
+ #
19
+
20
+ validates :refname, :presence => true
21
+
22
+ validates_associated :actions
23
+ validates_associated :archs
24
+ validates_associated :authors
25
+ validates_associated :mixins
26
+ validates_associated :platforms
27
+ validates_associated :refs
28
+ validates_associated :targets
29
+
30
+ def add_action(name)
31
+ self.actions.build(:name => name).save
32
+ end
33
+
34
+ def add_arch(name)
35
+ self.archs.build(:name => name).save
36
+ end
37
+
38
+ def add_author(name, email=nil)
39
+ self.authors.build(:name => name, :email => email).save
40
+ end
41
+
42
+ def add_mixin(name)
43
+ self.mixins.build(:name => name).save
44
+ end
45
+
46
+ def add_platform(name)
47
+ self.platforms.build(:name => name).save
48
+ end
49
+
50
+ def add_ref(name)
51
+ self.refs.build(:name => name).save
52
+ end
53
+
54
+ def add_target(index, name)
55
+ self.targets.build(:index => index, :name => name).save
56
+ end
57
+
58
+ ActiveSupport.run_load_hooks(:mdm_module_detail, self)
59
+ end
@@ -0,0 +1,24 @@
1
+ class Mdm::ModuleMixin < ActiveRecord::Base
2
+ self.table_name = 'module_mixins'
3
+
4
+ #
5
+ # Associations
6
+ #
7
+
8
+ belongs_to :module_detail, :class_name => 'Mdm::ModuleDetail'
9
+
10
+ #
11
+ # Mass Assignment Security
12
+ #
13
+
14
+ attr_accessible :name
15
+
16
+ #
17
+ # Validation
18
+ #
19
+
20
+ validates :module_detail, :presence => true
21
+ validates :name, :presence => true
22
+
23
+ ActiveSupport.run_load_hooks(:mdm_module_mixin, self)
24
+ end