metasploit-model 0.28.0-java → 0.29.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/config/locales/en.yml +0 -171
- data/lib/metasploit/model.rb +0 -2
- data/lib/metasploit/model/spec.rb +0 -130
- data/lib/metasploit/model/version.rb +1 -1
- data/spec/support/shared/examples/metasploit/model/search/operator/help.rb +4 -6
- data/spec/support/shared/examples/metasploit/model/translation.rb +1 -1
- data/spec/support/shared/examples/search_association.rb +1 -1
- data/spec/support/shared/examples/search_with.rb +4 -2
- metadata +2 -348
- data/app/models/metasploit/model/module/ancestor/spec/template.rb +0 -125
- data/app/models/metasploit/model/module/class/spec/template.rb +0 -92
- data/app/models/metasploit/model/module/instance/spec/template.rb +0 -97
- data/app/models/metasploit/model/spec/template.rb +0 -277
- data/app/validators/derivation_validator.rb +0 -17
- data/app/validators/dynamic_length_validator.rb +0 -45
- data/lib/metasploit/model/architecture.rb +0 -342
- data/lib/metasploit/model/author.rb +0 -54
- data/lib/metasploit/model/authority.rb +0 -141
- data/lib/metasploit/model/authority/bid.rb +0 -10
- data/lib/metasploit/model/authority/cve.rb +0 -10
- data/lib/metasploit/model/authority/msb.rb +0 -10
- data/lib/metasploit/model/authority/osvdb.rb +0 -10
- data/lib/metasploit/model/authority/pmasa.rb +0 -10
- data/lib/metasploit/model/authority/secunia.rb +0 -10
- data/lib/metasploit/model/authority/us_cert_vu.rb +0 -10
- data/lib/metasploit/model/authority/waraxe.rb +0 -31
- data/lib/metasploit/model/authority/zdi.rb +0 -10
- data/lib/metasploit/model/derivation.rb +0 -109
- data/lib/metasploit/model/derivation/full_name.rb +0 -19
- data/lib/metasploit/model/email_address.rb +0 -124
- data/lib/metasploit/model/module.rb +0 -20
- data/lib/metasploit/model/module/action.rb +0 -52
- data/lib/metasploit/model/module/ancestor.rb +0 -491
- data/lib/metasploit/model/module/ancestor/spec.rb +0 -6
- data/lib/metasploit/model/module/architecture.rb +0 -34
- data/lib/metasploit/model/module/author.rb +0 -40
- data/lib/metasploit/model/module/class.rb +0 -403
- data/lib/metasploit/model/module/class/spec.rb +0 -6
- data/lib/metasploit/model/module/handler.rb +0 -29
- data/lib/metasploit/model/module/instance.rb +0 -622
- data/lib/metasploit/model/module/instance/spec.rb +0 -6
- data/lib/metasploit/model/module/path.rb +0 -159
- data/lib/metasploit/model/module/platform.rb +0 -32
- data/lib/metasploit/model/module/rank.rb +0 -85
- data/lib/metasploit/model/module/reference.rb +0 -32
- data/lib/metasploit/model/module/stance.rb +0 -16
- data/lib/metasploit/model/module/target.rb +0 -78
- data/lib/metasploit/model/module/target/architecture.rb +0 -34
- data/lib/metasploit/model/module/target/platform.rb +0 -34
- data/lib/metasploit/model/module/type.rb +0 -38
- data/lib/metasploit/model/platform.rb +0 -246
- data/lib/metasploit/model/real_pathname.rb +0 -16
- data/lib/metasploit/model/reference.rb +0 -104
- data/spec/app/models/metasploit/model/module/ancestor/spec/template_spec.rb +0 -174
- data/spec/app/models/metasploit/model/module/class/spec/template_spec.rb +0 -222
- data/spec/app/models/metasploit/model/module/instance/spec/template_spec.rb +0 -201
- data/spec/app/models/metasploit/model/search/operator/deprecated/app_spec.rb +0 -62
- data/spec/app/models/metasploit/model/search/operator/deprecated/author_spec.rb +0 -197
- data/spec/app/models/metasploit/model/search/operator/deprecated/authority_spec.rb +0 -135
- data/spec/app/models/metasploit/model/search/operator/deprecated/platform_spec.rb +0 -124
- data/spec/app/models/metasploit/model/search/operator/deprecated/ref_spec.rb +0 -387
- data/spec/app/models/metasploit/model/search/operator/deprecated/text_spec.rb +0 -399
- data/spec/app/models/metasploit/model/spec/template_spec.rb +0 -23
- data/spec/app/validators/derivation_validator_spec.rb +0 -92
- data/spec/app/validators/dynamic_length_validator_spec.rb +0 -293
- data/spec/dummy/app/models/dummy/architecture.rb +0 -92
- data/spec/dummy/app/models/dummy/author.rb +0 -15
- data/spec/dummy/app/models/dummy/authority.rb +0 -130
- data/spec/dummy/app/models/dummy/email_address.rb +0 -27
- data/spec/dummy/app/models/dummy/module/action.rb +0 -25
- data/spec/dummy/app/models/dummy/module/ancestor.rb +0 -67
- data/spec/dummy/app/models/dummy/module/architecture.rb +0 -19
- data/spec/dummy/app/models/dummy/module/author.rb +0 -28
- data/spec/dummy/app/models/dummy/module/class.rb +0 -69
- data/spec/dummy/app/models/dummy/module/instance.rb +0 -209
- data/spec/dummy/app/models/dummy/module/path.rb +0 -64
- data/spec/dummy/app/models/dummy/module/platform.rb +0 -19
- data/spec/dummy/app/models/dummy/module/rank.rb +0 -44
- data/spec/dummy/app/models/dummy/module/reference.rb +0 -19
- data/spec/dummy/app/models/dummy/module/target.rb +0 -62
- data/spec/dummy/app/models/dummy/module/target/architecture.rb +0 -19
- data/spec/dummy/app/models/dummy/module/target/platform.rb +0 -19
- data/spec/dummy/app/models/dummy/platform.rb +0 -58
- data/spec/dummy/app/models/dummy/reference.rb +0 -31
- data/spec/dummy/spec/factories/dummy/architectures.rb +0 -13
- data/spec/dummy/spec/factories/dummy/authorities.rb +0 -32
- data/spec/dummy/spec/factories/dummy/authors.rb +0 -8
- data/spec/dummy/spec/factories/dummy/email_addresses.rb +0 -8
- data/spec/dummy/spec/factories/dummy/module/actions.rb +0 -13
- data/spec/dummy/spec/factories/dummy/module/ancestors.rb +0 -45
- data/spec/dummy/spec/factories/dummy/module/architectures.rb +0 -35
- data/spec/dummy/spec/factories/dummy/module/authors.rb +0 -10
- data/spec/dummy/spec/factories/dummy/module/classes.rb +0 -40
- data/spec/dummy/spec/factories/dummy/module/instances.rb +0 -86
- data/spec/dummy/spec/factories/dummy/module/paths.rb +0 -16
- data/spec/dummy/spec/factories/dummy/module/platforms.rb +0 -35
- data/spec/dummy/spec/factories/dummy/module/ranks.rb +0 -14
- data/spec/dummy/spec/factories/dummy/module/references.rb +0 -17
- data/spec/dummy/spec/factories/dummy/module/target/architectures.rb +0 -40
- data/spec/dummy/spec/factories/dummy/module/target/platforms.rb +0 -41
- data/spec/dummy/spec/factories/dummy/module/targets.rb +0 -46
- data/spec/dummy/spec/factories/dummy/platforms.rb +0 -3
- data/spec/dummy/spec/factories/dummy/references.rb +0 -26
- data/spec/factories/metasploit/model/architectures.rb +0 -6
- data/spec/factories/metasploit/model/authorities.rb +0 -28
- data/spec/factories/metasploit/model/authors.rb +0 -9
- data/spec/factories/metasploit/model/email_addresses.rb +0 -14
- data/spec/factories/metasploit/model/module/actions.rb +0 -9
- data/spec/factories/metasploit/model/module/ancestors.rb +0 -180
- data/spec/factories/metasploit/model/module/architectures.rb +0 -15
- data/spec/factories/metasploit/model/module/classes.rb +0 -47
- data/spec/factories/metasploit/model/module/handlers.rb +0 -3
- data/spec/factories/metasploit/model/module/instances.rb +0 -83
- data/spec/factories/metasploit/model/module/paths.rb +0 -51
- data/spec/factories/metasploit/model/module/platforms.rb +0 -15
- data/spec/factories/metasploit/model/module/ranks.rb +0 -9
- data/spec/factories/metasploit/model/module/references.rb +0 -11
- data/spec/factories/metasploit/model/module/stances.rb +0 -3
- data/spec/factories/metasploit/model/module/targets.rb +0 -22
- data/spec/factories/metasploit/model/module/types.rb +0 -5
- data/spec/factories/metasploit/model/references.rb +0 -88
- data/spec/lib/metasploit/model/architecture_spec.rb +0 -52
- data/spec/lib/metasploit/model/author_spec.rb +0 -6
- data/spec/lib/metasploit/model/authority/bid_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/cve_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/msb_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/osvdb_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/pmasa_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/secunia_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/us_cert_vu_spec.rb +0 -17
- data/spec/lib/metasploit/model/authority/waraxe_spec.rb +0 -51
- data/spec/lib/metasploit/model/authority/zdi_spec.rb +0 -21
- data/spec/lib/metasploit/model/authority_spec.rb +0 -10
- data/spec/lib/metasploit/model/derivation/full_name_spec.rb +0 -75
- data/spec/lib/metasploit/model/derivation_spec.rb +0 -217
- data/spec/lib/metasploit/model/email_address_spec.rb +0 -19
- data/spec/lib/metasploit/model/module/action_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/ancestor_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/architecture_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/author_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/class_spec.rb +0 -19
- data/spec/lib/metasploit/model/module/handler_spec.rb +0 -61
- data/spec/lib/metasploit/model/module/instance_spec.rb +0 -183
- data/spec/lib/metasploit/model/module/path_spec.rb +0 -6
- data/spec/lib/metasploit/model/module/platform_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/rank_spec.rb +0 -29
- data/spec/lib/metasploit/model/module/reference_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/stance_spec.rb +0 -30
- data/spec/lib/metasploit/model/module/target/architecture_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/target/platform_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/target_spec.rb +0 -9
- data/spec/lib/metasploit/model/module/type_spec.rb +0 -125
- data/spec/lib/metasploit/model/platform_spec.rb +0 -100
- data/spec/lib/metasploit/model/reference_spec.rb +0 -21
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/contents/metasploit_module.rb +0 -12
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents.rb +0 -10
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents/metasploit_module.rb +0 -15
- data/spec/support/shared/examples/derives.rb +0 -115
- data/spec/support/shared/examples/metasploit/model/architecture.rb +0 -425
- data/spec/support/shared/examples/metasploit/model/architecture/seed.rb +0 -25
- data/spec/support/shared/examples/metasploit/model/author.rb +0 -27
- data/spec/support/shared/examples/metasploit/model/authority.rb +0 -124
- data/spec/support/shared/examples/metasploit/model/authority/seed.rb +0 -49
- data/spec/support/shared/examples/metasploit/model/email_address.rb +0 -220
- data/spec/support/shared/examples/metasploit/model/module/action.rb +0 -26
- data/spec/support/shared/examples/metasploit/model/module/ancestor.rb +0 -2004
- data/spec/support/shared/examples/metasploit/model/module/ancestor/payload_factory.rb +0 -63
- data/spec/support/shared/examples/metasploit/model/module/architecture.rb +0 -36
- data/spec/support/shared/examples/metasploit/model/module/author.rb +0 -29
- data/spec/support/shared/examples/metasploit/model/module/class.rb +0 -1514
- data/spec/support/shared/examples/metasploit/model/module/handler.rb +0 -21
- data/spec/support/shared/examples/metasploit/model/module/instance.rb +0 -1384
- data/spec/support/shared/examples/metasploit/model/module/instance/class_methods.rb +0 -537
- data/spec/support/shared/examples/metasploit/model/module/instance/is_not_stanced_with_module_type.rb +0 -22
- data/spec/support/shared/examples/metasploit/model/module/instance/is_stanced_with_module_type.rb +0 -38
- data/spec/support/shared/examples/metasploit/model/module/instance/validates/dynamic_length_of.rb +0 -131
- data/spec/support/shared/examples/metasploit/model/module/path.rb +0 -493
- data/spec/support/shared/examples/metasploit/model/module/platform.rb +0 -36
- data/spec/support/shared/examples/metasploit/model/module/rank.rb +0 -92
- data/spec/support/shared/examples/metasploit/model/module/reference.rb +0 -16
- data/spec/support/shared/examples/metasploit/model/module/target.rb +0 -29
- data/spec/support/shared/examples/metasploit/model/module/target/architecture.rb +0 -56
- data/spec/support/shared/examples/metasploit/model/module/target/platform.rb +0 -56
- data/spec/support/shared/examples/metasploit/model/platform.rb +0 -213
- data/spec/support/shared/examples/metasploit/model/real_pathname.rb +0 -29
- data/spec/support/shared/examples/metasploit/model/reference.rb +0 -410
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/app.rb +0 -44
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/authority.rb +0 -72
- data/spec/support/templates/metasploit/model/module/ancestors/_attributes.rb.erb +0 -9
- data/spec/support/templates/metasploit/model/module/ancestors/_methods.rb.erb +0 -8
- data/spec/support/templates/metasploit/model/module/ancestors/_validations.rb.erb +0 -6
- data/spec/support/templates/metasploit/model/module/ancestors/base.rb.erb +0 -3
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_auxiliary.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_encoder.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_exploit.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_non_payload.rb.erb +0 -5
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_nop.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_payload.rb.erb +0 -4
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_post.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_handled.rb.erb +0 -20
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_single.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stage.rb.erb +0 -0
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stager.rb.erb +0 -1
- data/spec/support/templates/metasploit/model/module/classes/_methods.rb.erb +0 -9
@@ -1,125 +0,0 @@
|
|
1
|
-
# Writes templates for the {#module_ancestor} to disk.
|
2
|
-
#
|
3
|
-
# @example Update files after changing
|
4
|
-
# module_ancestor = FactoryGirl.build(
|
5
|
-
# :dummy_module_ancestor
|
6
|
-
# )
|
7
|
-
# # factory already wrote template when build returned
|
8
|
-
#
|
9
|
-
# # update
|
10
|
-
# module_ancestor.module_type = FactoryGirl.generate :metasploit_model_module_type
|
11
|
-
#
|
12
|
-
# # Now the template on disk is different than the module_ancestor, so regenerate the template
|
13
|
-
# Metasploit::Model::Module::Ancestor::Spec::Template.write(module_ancestor: module_ancestor)
|
14
|
-
class Metasploit::Model::Module::Ancestor::Spec::Template < Metasploit::Model::Spec::Template
|
15
|
-
extend Metasploit::Model::Spec::Template::Write
|
16
|
-
|
17
|
-
#
|
18
|
-
# CONSTANTS
|
19
|
-
#
|
20
|
-
|
21
|
-
# Default value for {#search_pathnames}.
|
22
|
-
DEFAULT_SEARCH_PATHNAMES = [
|
23
|
-
Pathname.new('module/ancestors')
|
24
|
-
]
|
25
|
-
# Default value for {#source_relative_name}.
|
26
|
-
DEFAULT_SOURCE_RELATIVE_NAME = 'base'
|
27
|
-
|
28
|
-
#
|
29
|
-
# Attributes
|
30
|
-
#
|
31
|
-
|
32
|
-
# @!attribute [rw] metasploit_module_relative_name
|
33
|
-
# The name of the Class/Module in the template. Defaults to
|
34
|
-
# `FactoryGirl.generate :metasploit_model_module_ancestor_metasploit_module_relative_name`.
|
35
|
-
#
|
36
|
-
# @return [String]
|
37
|
-
attr_writer :metasploit_module_relative_name
|
38
|
-
|
39
|
-
# @!attribute [rw] module_ancestor
|
40
|
-
# The module ancestor to write.
|
41
|
-
#
|
42
|
-
# @return [Metasploit::Model::Module::Ancestor]
|
43
|
-
attr_accessor :module_ancestor
|
44
|
-
|
45
|
-
#
|
46
|
-
# Validations
|
47
|
-
#
|
48
|
-
|
49
|
-
validates :module_ancestor,
|
50
|
-
presence: true
|
51
|
-
|
52
|
-
#
|
53
|
-
# Methods
|
54
|
-
#
|
55
|
-
|
56
|
-
# The pathname where to {#write} to template results.
|
57
|
-
#
|
58
|
-
# @return [Pathname] `Metasploit::Model::Module::Ancestor#real_pathname.
|
59
|
-
# @return [nil] if {#module_ancestor} is `nil`.
|
60
|
-
# @return [nil] if {#module_ancestor #module_ancestor's} `Metasploit::Model::Module::Ancestor#real_pathname` is `nil`
|
61
|
-
# after derivation.
|
62
|
-
def destination_pathname
|
63
|
-
unless instance_variable_defined? :@destination_pathname
|
64
|
-
@destination_pathname = nil
|
65
|
-
|
66
|
-
if module_ancestor
|
67
|
-
destination_pathname = module_ancestor.real_pathname
|
68
|
-
|
69
|
-
unless destination_pathname
|
70
|
-
# validate to derive real_path and therefore real_pathname
|
71
|
-
module_ancestor.valid?
|
72
|
-
|
73
|
-
destination_pathname = module_ancestor.real_pathname
|
74
|
-
end
|
75
|
-
|
76
|
-
@destination_pathname = destination_pathname
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
@destination_pathname
|
81
|
-
end
|
82
|
-
|
83
|
-
# Local variables exposed to partials.
|
84
|
-
#
|
85
|
-
# @return [Hash{Symbol => Object}] {#metasploit_module_relative_name} as :metasploit_module_relative_name and
|
86
|
-
# {#module_ancestor} at :module_ancestor.
|
87
|
-
def locals
|
88
|
-
@locals ||= {
|
89
|
-
metasploit_module_relative_name: metasploit_module_relative_name,
|
90
|
-
module_ancestor: module_ancestor
|
91
|
-
}
|
92
|
-
end
|
93
|
-
|
94
|
-
# Name of the Class/Module declared in the template file.
|
95
|
-
#
|
96
|
-
# @return [String]
|
97
|
-
def metasploit_module_relative_name
|
98
|
-
@metasploit_module_relative_name ||= FactoryGirl.generate :metasploit_model_module_ancestor_metasploit_module_relative_name
|
99
|
-
end
|
100
|
-
|
101
|
-
# Whether to overwrite a pre-existing file.
|
102
|
-
#
|
103
|
-
# @return [Boolean] Defaults to `false` since nothing should write the template before the ancestor.
|
104
|
-
def overwrite
|
105
|
-
unless instance_variable_defined? :@overwrite
|
106
|
-
@overwrite = false
|
107
|
-
end
|
108
|
-
|
109
|
-
@overwrite
|
110
|
-
end
|
111
|
-
|
112
|
-
# Pathnames to search for partials.
|
113
|
-
#
|
114
|
-
# @return [Array<Pathname>] {DEFAULT_SEARCH_PATHNAMES}
|
115
|
-
def search_pathnames
|
116
|
-
@search_pathnames ||= DEFAULT_SEARCH_PATHNAMES.dup
|
117
|
-
end
|
118
|
-
|
119
|
-
# Name of template under {#search_pathnames} without {EXTENSION}.
|
120
|
-
#
|
121
|
-
# @return [String] Defaults to {DEFAULT_SOURCE_RELATIVE_NAME}.
|
122
|
-
def source_relative_name
|
123
|
-
@source_relative_name ||= DEFAULT_SOURCE_RELATIVE_NAME
|
124
|
-
end
|
125
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# Writes templates for the {#module_class #module_class's} {Metasploit::Model::Module::Class#ancestors} to disk.
|
2
|
-
#
|
3
|
-
# @example Update files after changing associations
|
4
|
-
# module_class = FactoryGirl.build(
|
5
|
-
# :dummy_module_class
|
6
|
-
# )
|
7
|
-
# # factory already wrote template when build returned
|
8
|
-
#
|
9
|
-
# # update associations
|
10
|
-
# rank = FactoryGirl.generate :dummy_rank
|
11
|
-
# module_class.rank = rank
|
12
|
-
#
|
13
|
-
# # Now the template on disk is different than the module_class, so regenerate the template
|
14
|
-
# Metasploit::Model::Module::Class::Spec::Template.write(module_class: module_class)
|
15
|
-
class Metasploit::Model::Module::Class::Spec::Template < Metasploit::Model::Base
|
16
|
-
extend Metasploit::Model::Spec::Template::Write
|
17
|
-
|
18
|
-
#
|
19
|
-
# Attributes
|
20
|
-
#
|
21
|
-
|
22
|
-
# @!attribute [rw] module_class
|
23
|
-
# The {Metasploit::Model::Module::Class} whose {Metasploit::Model::Module::Class#ancestors} need to be templated in
|
24
|
-
# {#ancestor_templates}.
|
25
|
-
#
|
26
|
-
# @return [Metasploit::Model::Module::Class]
|
27
|
-
attr_accessor :module_class
|
28
|
-
|
29
|
-
#
|
30
|
-
# Validations
|
31
|
-
#
|
32
|
-
|
33
|
-
validates :module_class,
|
34
|
-
presence: true
|
35
|
-
validate :ancestor_templates_valid
|
36
|
-
|
37
|
-
#
|
38
|
-
# Methods
|
39
|
-
#
|
40
|
-
|
41
|
-
# Template for {#module_class} {Metasploit::Model::Module::Class#ancestors} with the addition of {#module_class} to
|
42
|
-
# the {Metasploit::Model::Spec::Template#locals} and adding 'module/classes' to the front of the
|
43
|
-
# {Metasploit::Model::Spec::Template#search_pathnames}.
|
44
|
-
#
|
45
|
-
# @return [Array<Metasploit::Model::Module::Ancestor::Spec::Template>]
|
46
|
-
# @return [[]] if {#module_class} is `nil`.
|
47
|
-
def ancestor_templates
|
48
|
-
unless instance_variable_defined? :@ancestor_templates
|
49
|
-
if module_class
|
50
|
-
@ancestor_templates = module_class.ancestors.collect { |module_ancestor|
|
51
|
-
Metasploit::Model::Module::Ancestor::Spec::Template.new(
|
52
|
-
module_ancestor: module_ancestor
|
53
|
-
).tap { |module_ancestor_template|
|
54
|
-
module_ancestor_template.locals[:module_class] = module_class
|
55
|
-
module_ancestor_template.overwrite = true
|
56
|
-
|
57
|
-
module_ancestor_template.search_pathnames.unshift(
|
58
|
-
Pathname.new('module/classes')
|
59
|
-
)
|
60
|
-
}
|
61
|
-
}
|
62
|
-
end
|
63
|
-
|
64
|
-
@ancestor_templates ||= []
|
65
|
-
end
|
66
|
-
|
67
|
-
@ancestor_templates
|
68
|
-
end
|
69
|
-
|
70
|
-
# Writes {#ancestor_templates} to disk.
|
71
|
-
#
|
72
|
-
# @return [void]
|
73
|
-
# @raise (see Metasploit::Model::Spec::Template)
|
74
|
-
def write
|
75
|
-
ancestor_templates.each(&:write)
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
# Validates that all {#ancestor_templates} are valid.
|
81
|
-
#
|
82
|
-
# @return [void]
|
83
|
-
def ancestor_templates_valid
|
84
|
-
# can't use ancestor_templates.all?(&:valid?) as it will short-circuit and want all ancestor_templates to have
|
85
|
-
# validation errors
|
86
|
-
valids = ancestor_templates.map(&:valid?)
|
87
|
-
|
88
|
-
unless valids.all?
|
89
|
-
errors.add(:ancestor_templates, :invalid, value: ancestor_templates)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
# Writes templates for the {#module_instance #module_instance's}
|
2
|
-
# {Metasploit::Model::Module::Instance#module_class #module_class's} {Metasploit::Model::Module::Class#ancestors} to
|
3
|
-
# disk.
|
4
|
-
#
|
5
|
-
# @example Update files after changing associations
|
6
|
-
# module_instance = FactoryGirl.build(
|
7
|
-
# :dummy_module_instance,
|
8
|
-
# module_architectures_length: 0
|
9
|
-
# )
|
10
|
-
# # factory already wrote template when build returned
|
11
|
-
#
|
12
|
-
# # update associations
|
13
|
-
# architecture = FactoryGirl.generate :dummy_architecture
|
14
|
-
# module_instance.module_architectures = FactoryGirl.build_list(
|
15
|
-
# :dummy_module_architecture,
|
16
|
-
# 1,
|
17
|
-
# architecture: architecture
|
18
|
-
# )
|
19
|
-
#
|
20
|
-
# # Now the template on disk is different than the module_instance, so regenerate the template
|
21
|
-
# Metasploit::Model::Module::Instance::Spec::Template.write(module_instance: module_instance)
|
22
|
-
class Metasploit::Model::Module::Instance::Spec::Template < Metasploit::Model::Base
|
23
|
-
extend Metasploit::Model::Spec::Template::Write
|
24
|
-
|
25
|
-
#
|
26
|
-
# Attributes
|
27
|
-
#
|
28
|
-
|
29
|
-
# @!attribute [rw] module_instance
|
30
|
-
# The {Metasploit::Model::Module::Instance} whose {Metasploit::Model::Module::Instance#module_class} needs to be
|
31
|
-
# templated in {#class_template}.
|
32
|
-
#
|
33
|
-
# @return [Metasploit::Model::Module::Instance]
|
34
|
-
attr_accessor :module_instance
|
35
|
-
|
36
|
-
#
|
37
|
-
# Validations
|
38
|
-
#
|
39
|
-
|
40
|
-
validates :class_template,
|
41
|
-
presence: true
|
42
|
-
validates :module_instance,
|
43
|
-
presence: true
|
44
|
-
validate :class_template_valid
|
45
|
-
|
46
|
-
#
|
47
|
-
# Methods
|
48
|
-
#
|
49
|
-
|
50
|
-
# Template for {#module_instance} {Metasploit::Model::Module::Instance#module_class} with the addition of
|
51
|
-
# {#module_instance} to the {Metasploit::Model::Spec::Template#locals} and adding 'module/instances' to the front of
|
52
|
-
# the {Metasploit::Model::Spec::Template#search_pathnames}.
|
53
|
-
#
|
54
|
-
# @return [Metasploit::Model::Module::Class::Spec::Template] if {#module_instance} present.
|
55
|
-
# @return [nil] if {#module_instance} is `nil`.
|
56
|
-
def class_template
|
57
|
-
unless instance_variable_defined? :@class_template
|
58
|
-
if module_instance
|
59
|
-
class_template = Metasploit::Model::Module::Class::Spec::Template.new(
|
60
|
-
module_class: module_instance.module_class
|
61
|
-
)
|
62
|
-
class_template.ancestor_templates.each do |ancestor_template|
|
63
|
-
ancestor_template.locals[:module_instance] = module_instance
|
64
|
-
|
65
|
-
ancestor_template.search_pathnames.unshift(
|
66
|
-
Pathname.new('module/instances')
|
67
|
-
)
|
68
|
-
end
|
69
|
-
|
70
|
-
@class_template = class_template
|
71
|
-
else
|
72
|
-
@class_template = nil
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
@class_template
|
77
|
-
end
|
78
|
-
|
79
|
-
# @!method write
|
80
|
-
# Writes {#class_template} to disk.
|
81
|
-
#
|
82
|
-
# @return [void]
|
83
|
-
# @raise (see Metasploit::Model::Spec::Template)
|
84
|
-
delegate :write,
|
85
|
-
to: :class_template
|
86
|
-
|
87
|
-
private
|
88
|
-
|
89
|
-
# Validates that {#class_template} is valid when present.
|
90
|
-
#
|
91
|
-
# @return [void]
|
92
|
-
def class_template_valid
|
93
|
-
if class_template && !class_template.valid?
|
94
|
-
errors.add(:class_template, :invalid, value: class_template)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,277 +0,0 @@
|
|
1
|
-
# Processes {EXTENSION '.rb.erb'} templates to create {Metasploit::Model::Module::Ancestor#contents} that contain the
|
2
|
-
# same metadata as the {Metasploit::Model::Module::Ancestor},
|
3
|
-
# {Metasploit::Model::Module::Class}, {Metasploit::Model::Module::Instance} and associations for those contents. This
|
4
|
-
# ensures that when the {Metasploit::Model::Module::Ancestor#contents} are loaded in metasploit-framework, the same
|
5
|
-
# metadata instances are derived from the contents ensuring idempotency of the contents and metadata parsing loop.
|
6
|
-
class Metasploit::Model::Spec::Template < Metasploit::Model::Base
|
7
|
-
extend ActiveSupport::Autoload
|
8
|
-
extend ActiveModel::Callbacks
|
9
|
-
|
10
|
-
include ActiveModel::Validations::Callbacks
|
11
|
-
|
12
|
-
autoload :Write
|
13
|
-
|
14
|
-
#
|
15
|
-
# CONSTANTS
|
16
|
-
#
|
17
|
-
|
18
|
-
# Regular expression to parse file from backtrace line
|
19
|
-
BACKTRACE_FILE_REGEXP = /(?<file>.*):\d+:in .*/
|
20
|
-
# Trim mode for ERB templates so that lines using <%- -%> will be trimmed of new lines
|
21
|
-
EXPLICIT_TRIM_MODE = '-'
|
22
|
-
# File extension for templates.
|
23
|
-
EXTENSION = '.rb.erb'
|
24
|
-
|
25
|
-
#
|
26
|
-
# Attributes
|
27
|
-
#
|
28
|
-
|
29
|
-
# @!attribute [rw] destination_pathname
|
30
|
-
# The pathname where to {#write} the template results.
|
31
|
-
#
|
32
|
-
# @return [String]
|
33
|
-
attr_accessor :destination_pathname
|
34
|
-
|
35
|
-
# @!attribute [rw] locals
|
36
|
-
# Local variables to exposed to partials.
|
37
|
-
#
|
38
|
-
# @return [Hash{Symbol => Object}]
|
39
|
-
attr_accessor :locals
|
40
|
-
|
41
|
-
# @!attribute [rw] overwrite
|
42
|
-
# Whether to overwrite a pre-existing file.
|
43
|
-
#
|
44
|
-
# @return [Boolean]
|
45
|
-
attr_accessor :overwrite
|
46
|
-
|
47
|
-
# @!attribute [rw] search_pathnames
|
48
|
-
# Pathnames to search for partials. First item is search first, etc.
|
49
|
-
#
|
50
|
-
# @return [Array<Pathname>]
|
51
|
-
attr_accessor :search_pathnames
|
52
|
-
|
53
|
-
# @!attribute [rw] source_relative_name
|
54
|
-
# Name of template under {#search_pathnames} without {EXTENSION} similar to how to refer to partials.
|
55
|
-
#
|
56
|
-
# @return [String]
|
57
|
-
attr_accessor :source_relative_name
|
58
|
-
|
59
|
-
|
60
|
-
#
|
61
|
-
# Callbacks
|
62
|
-
#
|
63
|
-
|
64
|
-
before_validation :search_real_pathnames
|
65
|
-
|
66
|
-
#
|
67
|
-
# Validations
|
68
|
-
#
|
69
|
-
|
70
|
-
validates :destination_pathname,
|
71
|
-
presence: true
|
72
|
-
validates :overwrite,
|
73
|
-
inclusion: {
|
74
|
-
in: [
|
75
|
-
false,
|
76
|
-
true
|
77
|
-
]
|
78
|
-
}
|
79
|
-
validates :search_pathnames,
|
80
|
-
length: {
|
81
|
-
minimum: 1
|
82
|
-
}
|
83
|
-
validates :source_pathname,
|
84
|
-
presence: true
|
85
|
-
|
86
|
-
#
|
87
|
-
# Methods
|
88
|
-
#
|
89
|
-
|
90
|
-
# Converts the `partial_relative_path` to a real (absolute) pathname that can be passed to {#result} by finding the
|
91
|
-
# corresponding file in the {#search_pathnames}.
|
92
|
-
#
|
93
|
-
# @param partial_relative_path [String] partial path name as used in Rails, so no search_pathname prefix and no '_'
|
94
|
-
# or file extension in the basename.
|
95
|
-
# @return (see #find_pathname)
|
96
|
-
def partial_pathname(partial_relative_path)
|
97
|
-
partial_relative_pathname = Pathname.new(partial_relative_path)
|
98
|
-
relative_directory = partial_relative_pathname.dirname
|
99
|
-
raw_basename = partial_relative_pathname.basename
|
100
|
-
partial_basename = "_#{raw_basename}#{EXTENSION}"
|
101
|
-
relative_pathname = relative_directory.join(partial_basename)
|
102
|
-
|
103
|
-
find_pathname(relative_pathname)
|
104
|
-
end
|
105
|
-
|
106
|
-
# Renders partial in templates.
|
107
|
-
#
|
108
|
-
# @param partial_relative_path [String] relative path to partial without extension and no leading '_' to match
|
109
|
-
# Rails convention.
|
110
|
-
# @param options (see #result)
|
111
|
-
# @option (see #result)
|
112
|
-
# @return [String, nil] result of rendering partial.
|
113
|
-
def render(partial_relative_path, options={})
|
114
|
-
pathname = partial_pathname(partial_relative_path)
|
115
|
-
result(pathname, options)
|
116
|
-
end
|
117
|
-
|
118
|
-
# Renders the super template of the current template by searching for the template of the same name under super
|
119
|
-
# {#search_pathnames} (those that have a higher index).
|
120
|
-
#
|
121
|
-
# @return [String, nil] result of rendering super partial.
|
122
|
-
# @raise [IOError] if super template can't be found on super search pathnames.
|
123
|
-
# @raise [RegexpError] if file can't be parsed from backtrace.
|
124
|
-
def render_super
|
125
|
-
super_pathname = nil
|
126
|
-
backtrace = caller
|
127
|
-
match = BACKTRACE_FILE_REGEXP.match(backtrace[0])
|
128
|
-
|
129
|
-
if match
|
130
|
-
real_path = match[:file]
|
131
|
-
current_search_pathname_found = false
|
132
|
-
relative_pathname = nil
|
133
|
-
|
134
|
-
search_pathnames.each do |search_pathname|
|
135
|
-
# find the current index
|
136
|
-
unless current_search_pathname_found
|
137
|
-
if real_path.starts_with?(search_pathname.to_path)
|
138
|
-
current_search_pathname_found = true
|
139
|
-
|
140
|
-
real_pathname = Pathname.new(real_path)
|
141
|
-
relative_pathname = real_pathname.relative_path_from(search_pathname)
|
142
|
-
end
|
143
|
-
# then switch to finding the next (super) index
|
144
|
-
else
|
145
|
-
real_pathname = search_pathname.join(relative_pathname)
|
146
|
-
|
147
|
-
if real_pathname.exist?
|
148
|
-
super_pathname = real_pathname
|
149
|
-
break
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
unless super_pathname
|
155
|
-
raise IOError, "Couldn't find super template"
|
156
|
-
end
|
157
|
-
else
|
158
|
-
raise RegexpError, "Can't parse file from backtrace to determine current search path"
|
159
|
-
end
|
160
|
-
|
161
|
-
result(super_pathname)
|
162
|
-
end
|
163
|
-
|
164
|
-
# @note Must be an instance method
|
165
|
-
# @param pathname [Pathname] pathname to template
|
166
|
-
# @param options [Hash{Symbol => Object}]
|
167
|
-
# @option options [Hash{Symbol => Object}] :locals Maps name of locals to their value for this result. Can override
|
168
|
-
# {#locals}.
|
169
|
-
def result(pathname, options={})
|
170
|
-
options.assert_valid_keys(:locals)
|
171
|
-
|
172
|
-
if pathname
|
173
|
-
content = pathname.read
|
174
|
-
safe_level = nil
|
175
|
-
template = ERB.new content, safe_level, EXPLICIT_TRIM_MODE
|
176
|
-
template.filename = pathname.to_path
|
177
|
-
|
178
|
-
erb_binding = binding.dup
|
179
|
-
locals = self.locals || {}
|
180
|
-
result_locals = options[:locals] || {}
|
181
|
-
merged_locals = locals.merge(result_locals)
|
182
|
-
|
183
|
-
merged_locals.each do |name, value|
|
184
|
-
erb_binding.eval("#{name} = nil; lambda { |value| #{name} = value }").call(value)
|
185
|
-
end
|
186
|
-
|
187
|
-
# use current binding to allow templates to call {#render} and then use {#method_missing} to allow access to
|
188
|
-
# locals
|
189
|
-
template.result(erb_binding)
|
190
|
-
else
|
191
|
-
''
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
class << self
|
196
|
-
# The root of all relative {#search_pathnames}. By changing {root} you can use your own set of templates.
|
197
|
-
#
|
198
|
-
# @return [Pathname] Defaults to 'spec/support/templates/metasploit/model' under Metasploit::Model.root.
|
199
|
-
def root
|
200
|
-
@@root ||= Metasploit::Model::Engine.root.join('spec', 'support', 'templates', 'metasploit', 'model')
|
201
|
-
end
|
202
|
-
|
203
|
-
# Sets the {root} pathname for all {#search_pathnames}, including those on subclasses.
|
204
|
-
#
|
205
|
-
# @param root [Pathname]
|
206
|
-
# @return [Pathname]
|
207
|
-
def root=(root)
|
208
|
-
@@root = root
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
# Converts {#source_relative_name} to a real (absolute) pathname.
|
213
|
-
#
|
214
|
-
# @return (see #find_pathname)
|
215
|
-
def source_pathname
|
216
|
-
unless instance_variable_defined? :@source_pathname
|
217
|
-
relative_path = "#{source_relative_name}#{EXTENSION}"
|
218
|
-
@source_pathname = find_pathname(relative_path)
|
219
|
-
end
|
220
|
-
|
221
|
-
@source_pathname
|
222
|
-
end
|
223
|
-
|
224
|
-
# Writes result of template to {#destination_pathname}.
|
225
|
-
#
|
226
|
-
# @return [void]
|
227
|
-
# @raise [Metasploit::Model::Spec::PathnameCollision] if {#overwrite} is false and {#destination_pathname} already
|
228
|
-
# exists.
|
229
|
-
def write
|
230
|
-
unless overwrite
|
231
|
-
Metasploit::Model::Spec::PathnameCollision.check!(destination_pathname)
|
232
|
-
end
|
233
|
-
|
234
|
-
result = self.result(source_pathname)
|
235
|
-
|
236
|
-
# make directory
|
237
|
-
destination_pathname.parent.mkpath
|
238
|
-
|
239
|
-
destination_pathname.open('wb') do |f|
|
240
|
-
f.write(result)
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
|
-
private
|
245
|
-
|
246
|
-
# Finds relative_path under {#search_pathnames}
|
247
|
-
#
|
248
|
-
# @return [Pathname] if relative_path exists under a search path.
|
249
|
-
# @return [nil] if `relative_path` does not exist under a search path.
|
250
|
-
def find_pathname(relative_path)
|
251
|
-
found_pathname = nil
|
252
|
-
|
253
|
-
search_pathnames.each do |search_pathname|
|
254
|
-
real_pathname = search_pathname.join(relative_path)
|
255
|
-
|
256
|
-
if real_pathname.exist?
|
257
|
-
found_pathname = real_pathname
|
258
|
-
break
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
found_pathname
|
263
|
-
end
|
264
|
-
|
265
|
-
# Makes sure all {#search_pathnames} are real (absolute). Relative pathnames are resolved against {root}.
|
266
|
-
#
|
267
|
-
# @return [void]
|
268
|
-
def search_real_pathnames
|
269
|
-
search_pathnames.collect! { |search_pathname|
|
270
|
-
if search_pathname.relative?
|
271
|
-
self.class.root.join(search_pathname)
|
272
|
-
else
|
273
|
-
search_pathname
|
274
|
-
end
|
275
|
-
}
|
276
|
-
end
|
277
|
-
end
|